3

我有一个示例项目:

https://github.com/ericgorr/nspanel_show.git

我的项目是一个故事板,基于文档的应用程序。我想使用自定义 segue 来切换检查器窗口的可见状态。我所拥有的应该可以工作,但我不能完全确定如何使检查器窗口成为单例。

我相信我应该从:

class InspectorWindowController: NSWindowController
{
    static let sharedInstance = InspectorWindowController()

//    override func init()
//    {
//        
//    }

    override func windowDidLoad()
    {
        super.windowDidLoad()

        NSLog( ":::: %@", InspectorWindowController.sharedInstance );
    }
}

但是,在我的情况下,初始化应该是什么样的,这让我无法理解,尤其是因为窗口位于情节提要内。

4

2 回答 2

4

您可以从窗口控制器场景中选择窗口控制器,并在属性检查器中SinglePresentation. 这将确保 show segue 仅使用窗口控制器的单个实例。有关更多信息,请参阅此答案

于 2017-11-22T00:12:50.553 回答
3

以下是我将如何修改您的代码:

  1. Main.storyboard给您的 InspectorWindowController 一个标识符,例如“Inspector Window Controller”
  2. InspectorWindowController中,按如下方式实现您的单例:

    static let shared: InspectorWindowController = {
        let storyboard = NSStoryboard(name:"Main", bundle: nil)
        let controller = storyboard.instantiateController(withIdentifier: "Inspector Window Controller")
        return controller as! InspectorWindowController
    }()
    
  3. Main.storyboard删除segue from WindowControllertoInspectorWindowController

  4. WindowControllershowMyPanel()hideMyPanel()IBActions替换为:

    @IBAction func toggleInspectorPanel( _ sender: AnyObject ) {
        let inspectorWindow = InspectorWindowController.shared.window!
        if inspectorWindow.isVisible {
            inspectorWindow.orderOut(self)
        } else {
            inspectorWindow.makeKeyAndOrderFront(self)
        }
    }
    
  5. 同样在 中WindowController,从 中删除NSLog()呼叫windowDidLoad()。它会导致对InspectorWindowController.shared初始化代码的递归调用。

  6. Main.storyboard链接检查器工具栏按钮到toggleInspectorPanel()

InspectorWindowController.shared例将被初始化,并在第一次被引用时加载检查器面板(但未显示)。

于 2016-12-06T19:04:52.897 回答