2015-07-17 16 views
6

Ich bin auf ein Problem gestoßen, bei dem ich nicht auf das Hauptfenster meiner App, , zugreifen kann, da es null zurückgibt.NSWindow gibt nil (NSApplication) zurück

let window = NSApplication.sharedApplication().mainWindow 

Ich habe festgestellt, ähnliche Fragen:

How to get Main Window (App Delegate) from other class (subclass of NSViewController)?

Aber tun:

let window = (NSApplication.sharedApplication() as! NSArray).objectAtIndex(0) 

Scheint nicht zu funktionieren.

Muss ich im Storyboard herumspielen?

Vielen Dank im Voraus.

Update:

Ich bin tatsächlich in den Hafen etwas von Objective-C versucht.

NSWindow *mainWindow = [[[NSApplication sharedApplication] windows] objectAtIndex:0]; 
    NSLog(@"%@", mainWindow.contentViewController); 

Dies gibt einen richtigen Wert, wenn sie in dem viewDidLoad() Block in einem NSViewController setzen, so vermute ich, es ist etwas falsch mit NSApplication.sharedApplication().

Antwort

6

Es ist auch Null zurückkehren kann, wenn die Haupt-App Fenster nicht aktiv auf macOS ist. Zum Beispiel stieß ich darauf, als ich einen Drag-and-Drop-Datei-Uploader machte. Wenn das Fenster nicht vorne (auf dem Betriebssystem) wäre, würde es null zurückgeben. Die folgende Codezeile wird Ihre App aktiviert (nach vorne bringen)

NSApp.activateIgnoringOtherApps(true) 

ich auch einen Timer benötigt, um meinen Ruf von Mainwindow in meinem Fall zu verzögern.

1

Von the docs:

Der Wert in dieser Eigenschaft ist nil wenn der Storyboard-App oder NIB-Datei noch nicht fertig geladen hat. Es könnte auch nil sein, wenn die App inaktiv oder versteckt ist.

Also, das ist eine ganz normale Sache, je nach den Umständen geschehen zu haben.

+0

Danke für die Antwort. Ich versuche, einen Wert zu View2 festzulegen, wenn eine Tabellenzelle für Ansicht 1 angezapft wird. Also soll es fertig geladen sein. Warum sollte das sein? –

+1

Ist Ihr Fenster das Hauptfenster? Wenn es ein 'NSPanel' ist, dann weigert es sich, main zu werden, es sei denn, Sie überschreiben' canBecomeMainWindow() ', um wahr zurückzugeben. Wenn es keine Titelleiste hat und nicht in der Größe veränderbar ist, wird es sich ebenfalls weigern, Hauptverzeichnis zu werden. –

+1

Als 'Initial Controller' wird ein' NSWindowController' mit 'NSWindow' gesetzt. Das 'NSWindow' hat eine Titelleiste und ist in der Größe veränderbar. Ich bin mir des 'NSPanel' nicht sicher ... habe es nie in meinem Code benutzt. –

1

Sie können dies stattdessen tun:

func applicationDidBecomeActive(notification: NSNotification) { 

     NSApplication.sharedApplication().mainWindow?.movable = false 
    } 
Verwandte Themen