2013-02-14 4 views
15

ho avuto una proprietà denominata myName nella mia classe, come:inviare la notifica quando una proprietà viene modificato utilizzando KVO

@property (nonatomic, strong) NSString *myName; 

ho bisogno di inviare una notifica quando il valore della proprietà myName viene modificata.

Ora sto facendo qualcosa di simile:

- (void)setMyName:(NSString *)name 
{ 
    _myName = name; 
    [[NSNotificationCenter defaultCenter] postNotificationName:CHANGE_NOTIFICATION object:nil]; 
} 

So che c'è qualcosa di simile Key-Value Observing in iOS. Ma non so come implementarlo, ho letto l'intero documento, ma non ho potuto ottenere una buona comprensione.

Per favore aiutami a capire come implementare lo stesso senza usare setter personalizzato.

risposta

31

Prova questo:

MyClass *var = [MyClass new]; 
[var addObserver:self forKeyPath:@"myName" options:NSKeyValueChangeOldKey context:nil]; 

e implementare

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context 
{ 

} 

questo metodo verrà chiamato in qualsiasi momento quando la proprietà myName cambia

+0

Grazie per la risposta :) –

+0

siete i benvenuti) – alex

+0

Ciao, mi chiedevo se la soluzione KVO è meglio quindi l'altra applicazione soluzione. Qualcuno può spiegarlo? – NicTesla

15

In - (void)setMyName:(NSString *)name fare questo, invece

[self willChangeValueForKey:@"myName"]; 
_myName = name; 
[self didChangeValueForKey:@"myName"]; 

//this generates the KVO's 

E dove si desidera ascoltare (la viewController), lì in viewDidLoad aggiungere questa riga:

[w addObserver: auto forKeyPath: @ "myName" opzioni: contesto NSKeyValueObservingOptionNew: nil];

// In questo modo, si registra viewController per l'ascolto di KVO.

e anche implementare questo metodo:

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context { 
    if ([[change objectForKey:NSKeyValueChangeNewKey] isEqual:[NSNull null]]) { 
     return; 
    } else { 
     //read the change dictionary, and have fun :) 
    } 
} 

// questo metodo viene richiamato, ogni volta che il valore della proprietà viene modificata.

+0

Grazie per la risposta :) –

+3

Questa risposta è molto meglio della risposta accettata, che non mostra come implementare KVO, solo come ascoltare le notifiche KVO già implementate – Chris

7

Per fare questo senza il setter del cliente, basta sintetizzare il setter di proprietà. Ciò creerà tutte le chiamate di supporto a willChangeValueForKey/didChangeValueForKey.

@synthesize myName;

valori delle proprietà quindi impostare con dot-sintassi:

self.myName = @ "Inigo Montoya"

Poi gli osservatori riceveranno automaticamente la notifica KVO.

(Sarà necessario rimuovere l'osservatore prima di rilasciare l'oggetto osservato.)

+0

Grazie per la risposta :) –