È possibile utilizzare KVO (valore chiave di osservazione) per rilevare una modifica del valore della proprietà hidden
.
Aggiungi il tuo osservatore (self
in questo esempio) nel seguente modo:
UIView* viewToObserve = [self getViewToObserve]; // implement getViewToObserve
[viewToObserve addObserver:self forKeyPath:@"hidden" options:0 context:NULL];
Ora aggiungere il seguente metodo alla classe osservatore:
- (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
}
}
}
verrà invocato il metodo osservatore ogni volta che il La proprietà hidden
modifica il suo valore. Se non sbaglio, il metodo verrà invocato in modo sincrono nel contesto del thread che apporta la modifica alla proprietà. Se hai bisogno di notifiche asincrone puoi aggiungerlo tu stesso, ad esempio utilizzando uno dei metodi NSObject
performSelector:withObject:afterDelay:
o performSelector:onThread:withObject:waitUntilDone:
.
BTW: Non sono necessari i controlli nel metodo Observer, ovviamente, se si osserva solo un singolo oggetto e/o proprietà. Ho lasciato i controlli a scopo illustrativo. Raccomando anche di leggere la documentazione di Apple su KVO e KVC (codifica del valore chiave) per capire cosa sta succedendo qui.
Il runtime continua felicemente a inviare notifiche all'osservatore anche se l'osservatore viene deallocato, causando un arresto anomalo dell'applicazione. Quindi non dimenticare di rimuovere l'osservatore prima di essere de-allocata, al più tardi, questo dovrebbe accadere in dell'osservatore dealloc
:
- (void) dealloc
{
UIView* viewToObserve = [self getViewToObserve];
[viewToObserve removeObserver:self forKeyPath:@"hidden"];
[super dealloc];
}
Con "cambiamento di stato nascosto", cosa si intende una modifica al valore della proprietà 'nascosta'? – herzbube
Che dire dell'osservazione della proprietà nascosta di ciascuna sottoview (così come della collezione di sottoview in modo da sapere quando una vista viene aggiunta/rimossa) usando KVO? – lnafziger