2016-12-04 13 views
2

У меня есть пример проекта, как:Каков правильный способ создания NSWindowController Singleton в Swift?

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 идентификатор, например, "Инспектор окна 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 удалить изгиб от WindowController до InspectorWindowController

  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, удалите NSLog() вызов из windowDidLoad(). Это вызывает рекурсивный вызов кода инициализации InspectorWindowController.shared.

  6. В Main.storyboard ссылается на кнопке панели инструментов, чтобы инспектор toggleInspectorPanel()

InspectorWindowController.shared одноэлементными будет инициализированы, и панель инспектора загружен (но не показана), в первый раз, он ссылается.

+0

Это, безусловно, (старый) способ решить эту проблему, но я хотел использовать segue. При наличии правильного синтаксиса InspectorWindowController это должно быть возможно. Проблема в том, что мне непонятно, как точно переопределить различные функции init для достижения одноэлементного шаблона. Если невозможно создать правильный синглтон, это было бы хорошо знать. – ericg

0

Вы можете выбрать оконный контроллер из сцены окна контроллера и в инспекторе атрибутов выбрать Single из всплывающего окна под Presentation. Это гарантирует, что show segue использует только один экземпляр оконного контроллера. См. this answer для получения дополнительной информации.