2015-01-17 14 views
10

Sto creando un'applicazione barra di stato OS X, quindi Voglio che l'applicazione venga nascosta.Come nascondere la finestra iniziale all'avvio con gli storyboard OS X

Ho creato un'applicazione "storyboard" e la finestra iniziale appare sempre, anche se "Visibile all'avvio" è deselezionato (era deselezionato per impostazione predefinita).


Nota: se disattivo "è regolatore iniziale", quindi l'applicazione si avvia correttamente, senza alcuna finestra, ma il mio (ormai orfano) Finestra sembra mai essere aggiunto alla storyboard:

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

Il controller "mainWindow" non è stato trovato (anche se ho impostato correttamente "Storyboard ID" sul controller di Windows).

Quindi penso che sia meglio lasciare "è regolatore iniziale", ma semplicemente avere la finestra principale nascosta alla partenza ...

+1

Perdonami per aver risposto alla domanda più di 1 anno fa, ma la finestra può essere istanziata dallo storyboard anche se non la si imposta come * controller vista iniziale *. Forse non si tiene l'istanza del controller finestra o finestra, credo. – Blaszard

risposta

10

Questo potrebbe essere un po 'di un hack, ma si può fare questo

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

E poi in seguito ...

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

Questo ha funzionato per me, ma ho dovuto mostrare la finestra all'interno di un blocco operativo perché non era mostrato affatto. OperationQueue.main.addOperation {?. finestra .makeKeyAndOrderFront (zero) NSApplication.shared() attivare (ignoringOtherApps: true}) – Chuy47

+0

perché Apple rende le cose difficili. Si trattava di controllare una casella con XIBS. Grazie mela – SpaceDog

25

Togliere il segno di "Is iniziale controller" scatola sul storyboard, lasciando la vostra applicazione ingegno su un controller iniziale. La tua app verrà eseguita, ma non avrà finestre.

screenshot

+1

Qualche idea su come visualizzare una finestra in questo caso? Vedi http://stackoverflow.com/questions/31166779/opening-a-window-for-status-bar-os-x-10-10-application –

+1

Utilizzare questa soluzione anziché l'hack sopra, grazie a Tim – leonarth

6

Deseleziona "è regolatore iniziale", ma poi è necessario impostare lo storyboard e la sua associata NSWindowController manualmente.

Il modo preciso di fare che è mostrato in this answer, che cito qui:

[...] nel vostro AppDelegate, impostare una proprietà per il controllo della finestra:

@property NSWindowController *myController; 

Nell'implementazione del metodo applicationDidFinishLaunching:, creare un riferimento allo Storyboard. In questo modo si ottiene l'accesso al controller della finestra dallo storyboard. Dopodiché, l'unica cosa che rimane da fare è visualizzare la finestra inviando il controller della finestra al metodo showWindow:.

#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

Il modo per farlo è proprio come si è tentato:

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)` 

L'unica cosa che probabilmente dimenticato è stato quello di deselezionare "Release quando è chiuso". Questa operazione rilascia immediatamente la finestra e impedisce al meccanismo di caricamento dello storyboard di trovarlo anche se si dispone dell'identificatore corretto.

Problemi correlati