2015-01-17 9 views
10

Ich erstelle eine OS X-Statusleiste Anwendung, also Ich möchte, dass die Anwendung versteckt gestartet wird.So blenden Sie das Startfenster beim Start mit OS X-Storyboards

Ich habe eine "Storyboard" -Anwendung erstellt, und das Anfangsfenster wird immer angezeigt, auch wenn "Beim Start sichtbar" deaktiviert ist (war standardmäßig deaktiviert).


Hinweis: Wenn ich deaktivieren „Ist Anfangs Controller“ dann die App startet korrekt und ohne Fenster, aber meine (jetzt Waise) Fenster scheint nie zu dem Storyboard hinzugefügt werden:

var mainWindow = NSStoryboard(name: "Main", bundle: nil)?.instantiateControllerWithIdentifier("mainWindow") 

Der "mainWindow" Controller wird nicht gefunden (obwohl ich "Storyboard ID" korrekt auf dem Window Controller eingestellt habe).

Also ich denke, es ist besser „Ist anfängliche Controller“ zu verlassen, sondern einfach das Hauptfenster beim Start versteckt haben ...

+1

Verzeihen Sie mir für die Antwort auf die Frage vor mehr als 1 Jahr, aber das Fenster kann aus dem Storyboard instanziiert werden, auch wenn Sie es nicht als * Initial View Controller * festlegen. Vielleicht halten Sie nicht die Fenster- oder Fenstercontroller-Instanz, denke ich. – Blaszard

Antwort

10

Dies ist ein bisschen wie ein Hack sein könnte, aber Sie können diese

tun
func applicationDidFinishLaunching(notification: NSNotification) { 
    // Insert code here to initialize your application 
    NSApplication.sharedApplication().windows.last!.close() 
} 

Und dann später ...

NSApplication.sharedApplication().windows.last!.makeKeyAndOrderFront(nil) 
NSApplication.sharedApplication().activateIgnoringOtherApps(true) 
+1

Das funktionierte für mich, aber ich musste das Fenster in einem Operation Block zeigen, weil es überhaupt nicht gezeigt wurde. OperationQueue.main.addOperation {?. Fenster .makeKeyAndOrderFront (nil) NSApplication.shared() aktivieren (ignoringOtherApps: true) } – Chuy47

+0

, warum Apple die Dinge schwierig macht. Es ging darum, eine Box mit XIBS zu überprüfen. Danke Apfel. – SpaceDog

25

Deaktivieren Sie das Kontroll "Ist Initial Controller" Feld auf dem Storyboard, Ihren App Witz verlassen hout einen anfänglichen Controller. Ihre App wird ausgeführt, hat aber kein Fenster.

screenshot

+1

Gibt es Ideen, wie man in diesem Fall ein Fenster anzeigt? Siehe http://stackoverflow.com/questions/31166779/opening-a-window-for-status-bar-os-x-10-10-application –

+1

Verwenden Sie diese Lösung anstelle des Hack oben, danke Tim – leonarth

6

Uncheck "Ist Initial Controller", aber dann müssen Sie das Storyboard und seine NSWindowController manuell zugeordnet einzustellen.

Die genaue Art und Weise, dies zu tun ist in this answer gezeigt, die ich hier zitieren werde:

[...] in Ihrem AppDelegate, eine Eigenschaft, für die Fenstersteuerung einzurichten:

@property NSWindowController *myController; 

Erstellen Sie in Ihrer applicationDidFinishLaunching: Methodenreferenz einen Verweis auf das Storyboard. Auf diese Weise erhalten Sie Zugriff auf Ihren Fenstercontroller über das Storyboard. Danach müssen Sie nur noch das Fenster anzeigen, indem Sie Ihrem Fenstercontroller die showWindow: Methode senden.

#import "AppDelegate.h" 

@interface AppDelegate() 
@end 

@implementation AppDelegate 

@synthesize myController; 

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification { 
    // get a reference to the storyboard 
    NSStoryboard *storyBoard = [NSStoryboard storyboardWithName:@"Main" bundle:nil]; 
    // instantiate your window controller 
    myController = [storyBoard instantiateControllerWithIdentifier:@"secondWindowController"]; 
    // show the window 
    [myController showWindow:self]; 
} 

@end 
0

Die Art und Weise, dies zu tun, ist genau wie Sie versucht:

let storyboard = NSStoryboard(name: "Main", bundle: nil) 
guard let mainWC = storyboard.instantiateControllerWithIdentifier("MainWindowController") as? MainWindowController else { 
    fatalError("Error getting main window controller") 
} 
// optionally store the reference here 
self.mainWindowController = mainWC 

mainWC.window?.makeKeyAndOrderFront(nil) // or use `.showWindow(self)` 

Das einzige, was Sie wahrscheinlich zu uncheck vergessen war "Release, wenn sie geschlossen". Dies würde das Fenster sofort freigeben und verhindern, dass der Mechanismus zum Laden von Storyboards es findet, selbst wenn Sie den richtigen Bezeichner hätten.

Verwandte Themen