2013-06-10 10 views
8

Czy mimo to można wykryć ukrytą zmianę stanu (lub inną zmianę) w podglądzie w UIView (nie UIViewController). Chciałabym jakoś to jakoś wykryć.IOS, UIView, Wykryj ukryte zmiany stanu w podglądzie

Istnieją powody, dla mojego szaleństwa.

+0

Z „ukrytego zmiany stanu”, masz na myśli zmianę wartości z własność 'ukryte'? – herzbube

+0

Co z obserwowaniem ukrytej właściwości każdego z subskrybentów (a także kolekcji subviews, aby wiedzieć, kiedy widok jest dodawany/usuwany) za pomocą KVO? – lnafziger

Odpowiedz

15

Można użyć KVO obserwacji (wartość klucza), aby wykryć zmiany do wartości nieruchomości hidden.

Dodaj obserwatora (self w tym przykładzie) w następujący sposób:

UIView* viewToObserve = [self getViewToObserve]; // implement getViewToObserve 
[viewToObserve addObserver:self forKeyPath:@"hidden" options:0 context:NULL]; 

Teraz dodaj następującą metodę do klasy obserwatora:

- (void) observeValueForKeyPath:(NSString*)keyPath ofObject:(id)object change:(NSDictionary*)change context:(void*)context 
{ 
    UIView* viewToObserve = [self getViewToObserve]; 
    if (object == viewToObserve) 
    { 
    if ([keyPath isEqualToString:@"hidden"]) 
    { 
     // react to state change 
    } 
    } 
} 

Sposób obserwator zostanie wywołany, gdy hidden Właściwość zmienia jej wartość. Jeśli się nie mylę, metoda zostanie wywołana synchronicznie w kontekście wątku, który wprowadza zmianę do właściwości. Jeśli potrzebujesz asynchroniczne powiadomienia można dodać, że sam, na przykład za pomocą jednej z metod performSelector:withObject:afterDelay:NSObject lub performSelector:onThread:withObject:waitUntilDone:.

BTW: Nie trzeba kontrole w metodzie obserwacyjnej, oczywiście, jeśli tylko obserwować pojedynczy obiekt i/lub mienia. Zostawiłem kontrole w celach ilustracyjnych. Ja również polecam czytanie dokumentacji Apple na KVO i KVC (klucz wartość kodowania), aby zrozumieć, co się tu dzieje.

Zadowolony użytkownik kontynuuje powiadamianie o obserwatorze, nawet jeśli obserwator został zwolniony - co skutkuje zawieszeniem aplikacji! Więc nie zapomnij usunąć obserwatora przed tym jest to de-alokowane, najpóźniej powinno to nastąpić w obserwatora dealloc:

- (void) dealloc 
{ 
    UIView* viewToObserve = [self getViewToObserve]; 
    [viewToObserve removeObserver:self forKeyPath:@"hidden"]; 
    [super dealloc]; 
} 
+0

[self.deleteButton addObserver: self forKeyPath: @ "ukrytych" opcji: 0 context: nil]; nie uruchamia się, gdy zmieniono parametr self.deleteButton.hidden. – ort11

+0

Nieważne, działa dobrze. – ort11