8

Perché non è possibile osservare la proprietà editing di un'istanza di UITableViewController?Osservazione della proprietà di modifica di un UITableViewController

Sto utilizzando il seguente codice:

[self addObserver:self 
     forKeyPath:@"editing" 
      options:(NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld) 
      context:NULL]; 

e hanno attuato il metodo:

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

... ma il metodo observeValueForKeyPath non viene mai chiamato quando questo valore cambia.


Secondo Ensuring KVC Compliance sezione di Apple:

Per le proprietà che sono un attributo o una relazione a-uno, questo richiede che la classe:

  • Implementare un metodo denominato -<key>, -is<Key> o una variabile di istanza <key> o _<key>.
  • Se la proprietà è modificabile, è necessario implementare anche -set<Key>:.
  • L'implementazione del metodo -set<Key>: non deve eseguire la convalida.
  • La classe deve implementare -validate<Key>:error: se la convalida è appropriata per la chiave.

La documentazione per la proprietà editing, afferma che essa è definita come:

@property(nonatomic, getter=isEditing) BOOL editing 

Dal momento che questa proprietà non è mutabile, l'unico punto di proiettile che deve essere conforme alle è il primo (cioè che esiste un metodo -is<Key> definito, ad esempio). Si può vedere che si conforma a questo osservando la dichiarazione della proprietà e notando che esiste un metodo isEditing definito. Pertanto, dovrebbe essere conforme al Key Value Observing. Come mai non funziona?

+0

Solo per curiosità, perché stai cercando di osservare la proprietà, invece di implementare 'setEditing: animated:'? –

+0

@Gordon: per motivi di debug relativi a tale metodo. – Senseful

risposta

21

stai confondendo valore-chiave Coding rispetto di valori-chiave Osservando conformità. La proprietà è conforme a KVC, il che significa che è possibile utilizzare [myViewController valueForKey:@"editing"] per accedervi (se ti piace digitare), ma questo non significa che sia conforme a KVO.

KVO-compliance is achieved by l'oggetto o l'attuazione di un setter KVC-compliant (punti elenco 2 e 3), che KVO andrà a capo automaticamente, o manualmente la pubblicazione notifiche KVO inviandosi will/didChangeValueForKey: messaggi.

UIViewController e UITableViewController non implementano pubblicamente setEditing:; se non lo implementano affatto, allora KVO lo avvolge automaticamente è fuori. Ciò lascia le notifiche manuali. Se non ricevi alcuna notifica KVO per la proprietà (e in effetti stai colpendo il messaggio addObserver:forKeyPath:options:context:), ciò suggerisce che tali classi non implementano in privato setEditing: né postano manualmente le notifiche KVO.

Pertanto, la proprietà non è osservabile.

Se l'unico modo in cui qualsiasi cosa imposta mai la proprietà editing è inviando il controllore di un messaggio setEditing:animated:, allora si può ignorare setEditing:animated: e inviare le notifiche KVO dalla vostra applicazione, e quindi la proprietà sarà osservabile.

+0

Grazie per la risposta informativa. Ho visto quella pagina a cui ti colleghi, ma sfortunatamente, non la spiega come hai fatto tu. – Senseful

Problemi correlati