2013-06-10 13 views
8

Esiste comunque un rilevamento di una modifica di stato nascosta (o altra modifica) in una vista secondaria in un UIView (non in UIViewController). Vorrei rilevare questo async in qualche modo.IOS, UIView, Rileva modifica stato nascosto in sottoview

Ci sono motivi per la mia follia.

+0

Con "cambiamento di stato nascosto", cosa si intende una modifica al valore della proprietà 'nascosta'? – herzbube

+0

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

risposta

15

È 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 NSObjectperformSelector: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]; 
} 
+0

[self.deleteButton addObserver: self forKeyPath: @ "hidden" options: 0 context: nil]; non si attiva quando self.deleteButton.hidden viene modificato. – ort11

+0

Non importa, funziona bene. – ort11