2016-12-04 4 views
2

Ich habe ein Beispielprojekt als:Was ist der richtige Weg, um einen NSWindowController Singleton in Swift zu machen?

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

Mein Projekt ist ein Storyboard, Dokument-basierte Anwendung. Ich möchte einen benutzerdefinierten Übergang verwenden, um den sichtbaren Status des Inspektorfensters umzuschalten. Was ich habe, sollte funktionieren, aber ich kann nicht ganz bestimmen, wie man das Inspektorfenster zu einem Singleton macht.

Ich glaube, ich sollte mit beginnen:

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

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

    override func windowDidLoad() 
    { 
     super.windowDidLoad() 

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

Aber genau das, was die Initialisierung wie in meiner Situation mir entweicht aussehen sollte, zumal das Fenster innerhalb eines Storyboards ist.

Antwort

2

Hier ist, wie ich den Code ändern würde:

  1. In Main.storyboard geben Sie Ihren InspectorWindowController eine Kennung, wie "Inspektor-Fenster Controller"
  2. In InspectorWindowController, implementieren Ihre Singleton wie folgt:

    static let shared: InspectorWindowController = { 
        let storyboard = NSStoryboard(name:"Main", bundle: nil) 
        let controller = storyboard.instantiateController(withIdentifier: "Inspector Window Controller") 
        return controller as! InspectorWindowController 
    }() 
    
  3. In Main.storyboard löschen Sie den Übergang von WindowController zu InspectorWindowController

  4. In WindowController ersetzen die showMyPanel() und hideMyPanel() IBActions mit:

    @IBAction func toggleInspectorPanel(_ sender: AnyObject) { 
        let inspectorWindow = InspectorWindowController.shared.window! 
        if inspectorWindow.isVisible { 
         inspectorWindow.orderOut(self) 
        } else { 
         inspectorWindow.makeKeyAndOrderFront(self) 
        } 
    } 
    
  5. Auch in WindowController, entfernen Sie den NSLog() Anruf von windowDidLoad(). Es verursacht einen rekursiven Aufruf des Initialisierungscodes InspectorWindowController.shared.

  6. In Main.storyboard verknüpfen die Symbolleiste Inspektor Schaltfläche toggleInspectorPanel()

Die InspectorWindowController.shared Singletons initialisiert werden, und das Panel Inspektor geladen (aber nicht gezeigt), das erste Mal auf sie verwiesen wird.

+0

Das ist sicherlich eine (alte) Möglichkeit, um dieses Problem zu lösen, aber ich wollte einen Übergang verwenden. Mit einem richtigen InspectorWindowController Singleton sollte dies möglich sein. Das Problem ist, dass es mir unklar ist, wie genau die verschiedenen Init-Funktionen überschrieben werden müssen, um das Singleton-Muster zu erhalten. Wenn es nicht möglich ist, einen richtigen Singleton zu erstellen, wäre das gut zu wissen. – ericg

0

Sie können den Fenster-Controller aus der Fenster-Controller-Szene auswählen und im Attribut-Inspector Single aus dem Popup unter Presentation auswählen. Dadurch wird sichergestellt, dass der Show-Abschnitt nur eine einzelne Instanz des Fenster-Controllers verwendet. Weitere Informationen finden Sie unter this answer.

Verwandte Themen