2010-08-18 9 views
7

Próbowałem – windowDidExpose:, ale to nie zadziałało. Co mam do tego spróbować?Jak śledzić otwarcie i zamknięcie programu NSWindow?

Moje okno to okno narzędziowe.

- edycji dla większej jasności -

Co chcę to:

viewWillAppear viewWillDisappear viewDidLoad viewDidUnload

w Cocoa Touch.

+1

'windowDidExpose: 'jest dla okna, które jest już uporządkowane, gdy zostało ujawnione przez inne okna b za sobą nakazał. –

+0

Och dzięki za wyjaśnienie. Trudno o tym wiedzieć tylko z opisem w odnośniku. – Eonil

+0

Opis jest lepszy dla powiadomienia, że ​​ta metoda odpowiada: http://developer.apple.com/mac/library/documentation/Cocoa/Reference/ApplicationKit/Classes/NSWindow_Class/Reference/Reference.html#//apple_ref/ c/data/NSWindowDidExposeNotification –

Odpowiedz

4

Istnieje windowDidClose:, ale to prawdopodobnie odnosi się tylko do zamknięcia; jeśli wysyłasz swoje okno z komunikatem orderOut:, nie sądzę, żeby to się liczyło.

Prawdopodobnie trzeba albo po prostu śledzić go z jakiegokolwiek kodu jesteś zamawiania przez okno i wyjść z lub podklasy klasę okna i zastąpić metody jak makeKeyAndOrderFront: i orderOut: (cokolwiek używasz, co najmniej) odpowiedzieć niestandardowe powiadomienia przed wywołaniem do super.

+0

Brak przesłania delegata? Trudno w to uwierzyć! Wydaje się, że nie jest dobrym pomysłem podklasowanie i przesłonięcie wszystkich powiązanych metod, ponieważ nie jestem pewien, które metody powinny zostać nadpisane w tym ... – Eonil

+0

Stąd pierwsza sugestia: Śledź go z dowolnego kodu, który mówi okno, aby zamówić lub wyjść . Jedynym sposobem, w jaki można to zrobić, nie za pomocą użytkownika, jest zamknięcie go przez użytkownika, a do tego jest 'windowDidClose:'. –

+0

OK, zrozumiałem. Dzięki jeszcze raz! – Eonil

0

Wpadłem na hakera, żeby sobie z tym poradzić. Nie ma żadnego powiadomienia, że ​​okno zostało umieszczone na ekranie, ale jest pewne powiadomienie, które z pewnością zostanie nadane wysłane, gdy okno zostanie umieszczone na ekranie. Mówię o NSWindowDidUpdateNotification, co oznacza, że ​​okno odświeżyło się.

Oczywiście, nie jest to tylko wysłane, gdy pojawi się okno - jest wysyłane za każdym razem, gdy okno się aktualizuje. Nie trzeba dodawać, że to powiadomienie jest wysyłane więcej niż jeden raz na numer część. Chcesz go obejrzeć za pierwszym razem, zrób coś i zignoruj ​​wszelkie kolejne powiadomienia. W moim przypadku chciałem dodać arkusz do okna, które później zamawiałaby kolejna część mojej aplikacji. Więc zrobiłem coś takiego:

__block id observer = [NSNotificationCenter.defaultCenter addObserverForName:NSWindowDidUpdateNotification object:window queue:nil usingBlock:^(NSNotification *note) { 
    [self showSetupSheet]; 
    [NSNotificationCenter.defaultCenter removeObserver:observer]; 
}]; 

nie ma szczególnego powodu, trzeba by użyć obserwatora obserwator metody oparte na bazie bloku będzie działać tak samo dobrze.

5

Bardzo stare pytanie, ale wyłącznie do celów dokumentacyjnych:


Tor otwarty: W kontrolerze okna przesłonić metodę:

-(void)showWindow:(id)sender 
{ 
    //add this for track the window close 
    [[NSNotificationCenter defaultCenter] addObserver:self 
              selector:@selector(windowWillClose) 
               name:NSWindowWillCloseNotification 
               object:nil]; 
    [super showWindow:sender]; 
    //do here what you want... 
} 

Tor zamknij wdrożenia metoda

-(void)windowWillClose 
{ 
    [[NSNotificationCenter defaultCenter] removeObserver:self]; 
    //do here what you want... 
} 
+0

Czy dobrze jest nie mieć jednego parametru "id" dla obserwatora? – Eonil

+0

to nie jest źle, ale tak, jeśli chcesz otrzymać obiekt, na przykład okno wysyłające, musisz zmienić obserwatora powiadomienia. – Kappe

0

Dla Swift

Tor otwarty W kontroler okna przesłonić metodę:

override func showWindow(sender: AnyObject?) { 
     NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(windowWillClose), name: NSWindowWillCloseNotification, object: nil) 
    } 

gąsienicy blisko: Wdrożenie metody:

func windowWillClose() -> Void { 

     NSNotificationCenter.defaultCenter().removeObserver(self); 
     //Do here what you want.. 
    } 
+0

Dla Swift 4: 'NotificationCenter.default.addObserver (self, selektor: #selector (windowWillClose), imię i nazwisko: NSWindow.willCloseNotification, obiekt window)' i '@objc func windowWillClose() -> Odpada { NotificationCenter .default.removeObserver (self) // Wykonaj to, co chcesz .. } –