Ich entwickle eine OSX-App, wo ich zuerst ein Login / Register-Fenster zeige, wenn der Benutzer sich noch nicht angemeldet hat.
Nach erfolgreicher Anmeldung zeige ich meinen Hauptansicht-Controller.
Wenn der Benutzer bereits angemeldet ist (ein Token wird gespeichert), muss die App direkt mit dem Hauptansicht-Controller gestartet werden.
Ich bin neu in der OSX-Entwicklung, habe für diese Art von Szenario gegoogelt, konnte aber nichts finden.
Also ging ich mit was ich denke sollte funktionieren. Es funktioniert manchmal, manchmal bekomme ich ein leeres Fenster.
Im Storyboard lasse ich das Hauptmenü und den Window Controller. Ich habe den "contains" -Segue zu meinem Hauptansicht-Controller entfernt.
In AppDelegate stelle ich folgendes:
%Vor% Etwa die Hälfte der Zeiten ist das Fenster leer und ich sehe in der Konsole "Fehler: Kein Hauptfenster!". Ich dachte, vielleicht kann ich applicationDidBecomeActive
verwenden, aber das heißt im Grunde, wenn es in den Vordergrund kommt und das ist nicht das, was ich brauche.
Außerdem, die Zeiten, wenn es funktioniert, und ich logge mich ein, dann möchte ich den Hauptansicht-Controller zeigen:
%Vor%Und hier bekomme ich auch "Fehler: Kein Hauptfenster!" (immer) und nichts passiert.
Die Dokumente sagen folgendes über mainWindow
ist nil:
Der Wert in dieser Eigenschaft ist null, wenn das Storyboard oder die nib-Datei der App noch nicht vollständig geladen wurde. Es kann auch Null sein, wenn die App inaktiv oder versteckt ist.
Aber warum ist das Storyboard beim Laden nicht fertig geladen oder die App nicht aktiv? Und beim Login-Erfolg ist die App definitiv aktiv und im Vordergrund und das Hauptfenster ist immer Null.
Was mache ich falsch? Wie kann ich diesen Workflow implementieren? Alternativ könnte ich einen "übergeordneten" View-Controller erstellen, diesen mit dem Fenster im Storyboard verbinden und den Login- oder Hauptansicht-Controller als verschachtelte View-Controller hinzufügen. Aber ich mag es nicht wirklich, einen do now-View-Controller hinzuzufügen.
Ich verwende XCode 7 (Beta 4), Swift 2, OSX 10.10.4
Bearbeiten:
Die NSStoryboard-Methoden kommen von einer Erweiterung, sieht so aus:
%Vor%Um die Lösung, die wir in den Kommentaren gefunden haben, als Antwort zu verwenden:
Offenbar ist NSApplication.sharedApplication().mainWindow
ein anderes Fenster als mein Hauptfenster im Storyboard.
Also habe ich eine Unterklasse NSWindowController
erstellt und sie dem Fenster im Storyboard mithilfe des Identity Inspectors zugewiesen.
Dann habe ich die Logik, die ich im App-Delegaten hatte, in diesen NSWindowController verschoben. Es sieht so aus:
%Vor%* Danke, Lucas Deraugh, dass er mich in die richtige Richtung gelenkt hat!