如何在 OSX 应用程序中恢复 window 位置?
How to restore window position in an OSX application?
我创建了一个故事板,其中 window 视图控制器作为初始视图控制器。我给 window 一个自动保存名称 preferencesWindow
。在首选项中,我选中了 [x] Restorable 和 [x] Release when closed。
当我进入菜单并单击首选项时,我会像这样加载 window 控制器:
let storyboard = NSStoryboard(name: "Preferences", bundle: nil)
let windowController = storyboard.instantiateInitialController() as? NSWindowController
let window = windowController?.window
windowController!.showWindow(self)
这将显示首选项视图控制器,当我将它拖到另一个位置并单击关闭按钮时,它将关闭。到目前为止,一切都很好。但是,当我再次从菜单中加载 window 时,它会显示在其原始位置,而不是我上次将 window 拖动到的位置。这是为什么?
回答
它似乎是 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)
这是 Xcode 6 中的错误,我不知道它是否已在 Xcode 7 中修复。
在 InterfaceBuilder 中设置自动保存无效。要让它工作,只需在 windowController 的 windowDidLoad()
中设置它的名称:
class MyWindowController: NSWindowController {
override func windowDidLoad() {
super.windowDidLoad()
self.windowFrameAutosaveName = "position"
}
}
Swift 4:
final class MyWindowController: NSWindowController {
override func windowDidLoad() {
super.windowDidLoad()
self.windowFrameAutosaveName = NSWindow.FrameAutosaveName(rawValue: "myWindow")
}
}
我创建了一个故事板,其中 window 视图控制器作为初始视图控制器。我给 window 一个自动保存名称 preferencesWindow
。在首选项中,我选中了 [x] Restorable 和 [x] Release when closed。
当我进入菜单并单击首选项时,我会像这样加载 window 控制器:
let storyboard = NSStoryboard(name: "Preferences", bundle: nil)
let windowController = storyboard.instantiateInitialController() as? NSWindowController
let window = windowController?.window
windowController!.showWindow(self)
这将显示首选项视图控制器,当我将它拖到另一个位置并单击关闭按钮时,它将关闭。到目前为止,一切都很好。但是,当我再次从菜单中加载 window 时,它会显示在其原始位置,而不是我上次将 window 拖动到的位置。这是为什么?
回答 它似乎是 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)
这是 Xcode 6 中的错误,我不知道它是否已在 Xcode 7 中修复。
在 InterfaceBuilder 中设置自动保存无效。要让它工作,只需在 windowController 的 windowDidLoad()
中设置它的名称:
class MyWindowController: NSWindowController {
override func windowDidLoad() {
super.windowDidLoad()
self.windowFrameAutosaveName = "position"
}
}
Swift 4:
final class MyWindowController: NSWindowController {
override func windowDidLoad() {
super.windowDidLoad()
self.windowFrameAutosaveName = NSWindow.FrameAutosaveName(rawValue: "myWindow")
}
}