2015-07-17 17 views
6

Znalazłem problem, w wyniku którego nie mogę uzyskać dostępu do głównego okna mojej aplikacji, , ponieważ zwraca ona zero.NSWindow zwraca zero (NSApplication)

let window = NSApplication.sharedApplication().mainWindow 

znalazłem podobne pytania:

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

Ale robi:

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

wydaje się nie działa.

Czy muszę bawić się w Storyboard?

Z góry dziękuję.

Aktualizacja:

Jestem rzeczywiście próbuje coś portu z Objective-C.

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

ta zwraca odpowiednią wartość, gdy umieścić w bloku viewDidLoad() w NSViewController, więc zgaduję, że jest coś nie tak z NSApplication.sharedApplication().

Odpowiedz

6

To również może powrócić nil jeśli główne okno aplikacji nie jest aktywna na MacOS. Na przykład wpadłem na to, kiedy robiłem drag and drop file uploader. Jeśli okno nie znajdowało się z przodu (w systemie operacyjnym), zwracałoby zero. Poniższy wiersz kodu aktywuje swoją aplikację (doprowadzić do przodu)

NSApp.activateIgnoringOtherApps(true) 

Potrzebowałem również timer opóźnić moje wezwanie MainWindow w moim przypadku.

1

Od the docs:

Wartość tej właściwości jest nil gdy aplikacja jest storyboard stalówki lub plik nie ma jeszcze gotowego ładowanie. Może również być nil, gdy aplikacja jest nieaktywna lub ukryta.

Jest to całkowicie normalne zjawisko, w zależności od okoliczności.

+0

Dzięki za odpowiedź. Próbuję ustawić wartość view2, gdy komórka tabeli dla widoku 1 jest stuknięty. Tak więc powinno się zakończyć ładowanie. Dlaczego miałoby to być? –

+1

Czy Twoje okno jest głównym oknem? Jeśli jest to 'NSPanel', to odmawia on statusu głównego, chyba że zastąpisz' canBecomeMainWindow() ', aby zwrócić true. Podobnie, jeśli nie ma paska tytułu i nie można zmienić jego rozmiaru, odmówi stanie się głównym. –

+1

Jako mój 'Initial Controller' ustawiony jest' NSWindowController' z 'NSWindow'. 'NSWindow' ma pasek tytułu i można go zmienić. Nie jestem pewien "NSPanel" ... nigdy go nie użyłem w moim kodzie. –

1

Można to zrobić w zamian:

func applicationDidBecomeActive(notification: NSNotification) { 

     NSApplication.sharedApplication().mainWindow?.movable = false 
    } 
Powiązane problemy