我有一个示例项目:
https://github.com/ericgorr/nspanel_show.git
我的项目是一个故事板,基于文档的应用程序。我想使用自定义segue切换Inspector窗口的可见状态。我有什么工作要做,但我不能完全决定如何使巡查员的窗口成为一个单独的窗口。
我认为我应该从以下几点开始:
class InspectorWindowController: NSWindowController
{
static let sharedInstance = InspectorWindowController()
// override func init()
// {
//
// }
override func windowDidLoad()
{
super.windowDidLoad()
NSLog( ":::: %@", InspectorWindowController.sharedInstance );
}
}
但在我的情况下初始化应该是什么样的,尤其是因为窗口位于故事板的内部。
最佳答案
以下是我如何修改您的代码:
在Main.storyboard
中,给InspectorWindowController一个标识符,例如“Inspector Window Controller”
在InspectorWindowController
中,按如下方式实现单例:
static let shared: InspectorWindowController = {
let storyboard = NSStoryboard(name:"Main", bundle: nil)
let controller = storyboard.instantiateController(withIdentifier: "Inspector Window Controller")
return controller as! InspectorWindowController
}()
在
Main.storyboard
中,删除从WindowController
到InspectorWindowController
在
WindowController
中,将showMyPanel()
和hideMyPanel()
i操作替换为:@IBAction func toggleInspectorPanel( _ sender: AnyObject ) {
let inspectorWindow = InspectorWindowController.shared.window!
if inspectorWindow.isVisible {
inspectorWindow.orderOut(self)
} else {
inspectorWindow.makeKeyAndOrderFront(self)
}
}
同样在
WindowController
中,从NSLog()
中删除windowDidLoad()
调用。它会导致对初始化代码的递归调用。在
InspectorWindowController.shared
中,将Inspector工具栏按钮链接到Main.storyboard
将初始化
toggleInspectorPanel()
singleton,并在第一次引用时加载inspector面板(但未显示)。