問題描述
如何在 OSX 應用程序中恢復窗口位置? (How to restore window position in an OSX application?)
我創建了一個故事板,它具有窗口視圖控制器作為初始視圖控制器。我給窗口一個自動保存名稱preferencesWindow
。在首選項中,我檢查了 [x] 可恢復和 [x] 關閉時釋放。
當我進入菜單並單擊首選項時,我會像這樣加載窗口控制器:
let storyboard = NSStoryboard(name: "Preferences", bundle: nil)
let windowController = storyboard.instantiateInitialController() as? NSWindowController
let window = windowController?.window
windowController!.showWindow(self)
這將顯示首選項視圖控制器,當我將其拖動到另一個位置並單擊關閉按鈕它將關閉。到目前為止,一切都很好。但是,當我從菜單中再次加載窗口時,它會顯示在它的原始位置,而不是我上次將窗口拖到的位置。這是為什麼呢?
Answer這似乎是xCode 7中的一個錯誤,在代碼中設置自動保存名稱解決了它。
let storyboard = NSStoryboard(name: "Preferences", bundle: nil)
let windowController = storyboard.instantiateInitialController() as? NSWindowController
let window = windowController?.window
window!.setFrameAutosaveName("preferences")
windowController!.showWindow(self)
參考解法
方法 1:
This is a bug in Xcode 6 and I don't know if it is fixed in Xcode 7.
Setting autosave in InterfaceBuilder has no effect. To get it to work just set its name in windowDidLoad()
of your windowController:
class MyWindowController: NSWindowController {
override func windowDidLoad() {
super.windowDidLoad()
self.windowFrameAutosaveName = "position"
}
}
方法 2:
Swift 4:
final class MyWindowController: NSWindowController {
override func windowDidLoad() {
super.windowDidLoad()
self.windowFrameAutosaveName = NSWindow.FrameAutosaveName(rawValue: "myWindow")
}
}
(by Mark、zisoft、dbrownjave)