2016-12-04 116 views
2

我有一个示例项目为:什么是在Swift中创建NSWindowController Singleton的正确方法?

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); 
    } 
} 

但初始化应该是什么样的我的情况是逃避我,特别是因为窗口是一个故事板内。

回答

2

这是我会怎么修改代码:

  1. Main.storyboard给你InspectorWindowController的标识符,如 “Inspector窗口控制器”
  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删除从WindowControllerInspectorWindowController

  4. WindowController与更换showMyPanel()hideMyPanel() IBActions:

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

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

InspectorWindowController.shared单将被初始化,并检查者面板装载(但未示出),在第一时间它被引用。

+0

这当然是(老)解决这个问题的方法,但我想用一个segue。使用适当的InspectorWindowController单例,这应该是可能的。问题是,我不清楚如何覆盖各种init函数来实现单例模式。如果不可能创建一个合适的单身人士,那很好知道。 – ericg

0

您可以从窗口控制器场景中选择窗口控制器,并在属性检查器中从弹出的Presentation下选择Single。这将确保show segue仅使用窗口控制器的单个实例。有关更多信息,请参阅this answer

相关问题