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.
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.
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];
}
Z „ukrytego zmiany stanu”, masz na myśli zmianę wartości z własność 'ukryte'? – herzbube
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