8

Warum kann ich die editing Eigenschaft einer Instanz von UITableViewController nicht beobachten?Die Bearbeitungseigenschaft eines UITableViewControllers beobachten

Ich verwende den folgenden Code:

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

Und haben die Methode implementiert:

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

... aber die observeValueForKeyPath Methode wird nie, wenn dieser Wert ändert genannt.


Nach Ensuring KVC Compliance Bereich von Apple:

Für Eigenschaften, die ein Attribut oder eine zu-Eins-Beziehung sind, erfordert dies, dass Ihre Klasse:

  • ein Verfahren -<key> namens Implement, -is<Key>, oder haben Sie eine Instanzvariable <key> oder _<key>. Wenn die Eigenschaft änderbar ist, sollte sie auch -set<Key>: implementieren.
  • Ihre Implementierung der -set<Key>:-Methode sollte keine Validierung durchführen.
  • Ihre Klasse sollte -validate<Key>:error: implementieren, wenn die Validierung für den Schlüssel geeignet ist.

Die Dokumentation für die editing Eigenschaft besagt, dass es ist wie folgt definiert:

@property(nonatomic, getter=isEditing) BOOL editing 

Da diese Eigenschaft nicht wandelbar ist, ist es der einzige Aufzählungspunkt, um die erste ist entsprechen müssen (dh dass zB eine -is<Key> Methode definiert ist). Sie können sehen, dass es dies entspricht, indem Sie die Deklaration der Eigenschaft betrachten und feststellen, dass eine isEditing Methode definiert ist. Daher sollte Key-Value-Observing-konform sein. Wie kommt es, dass es nicht funktioniert?

+0

Nur aus Neugier, warum versuchen Sie, die Eigenschaft zu beobachten, im Gegensatz zur Implementierung von 'setEditing: animated:'? –

+0

@Gordon: zum Debuggen von Gründen im Zusammenhang mit dieser Methode. – Senseful

Antwort

21

Sie sind verwirrend Schlüssel-Wert Kodierung Übereinstimmung mit Schlüssel-Wert Beobachten Einhaltung. Die Eigenschaft ist KVC-konform, was bedeutet, dass Sie [myViewController valueForKey:@"editing"] verwenden können, um darauf zuzugreifen (wenn Sie gerne tippen), aber das bedeutet nicht, dass es KVO-konform ist.

KVO-compliance is achieved by das Objekt entweder Implementieren eines KVC-compliant setter (Aufzählungspunkte 2 und 3), die KVO automatisch einzuwickeln oder manuell veröffentlichen KVO Benachrichtigungen von selbst will/didChangeValueForKey: Senden von Nachrichten.

UIViewController und UITableViewController implementieren nicht öffentlich setEditing:; wenn sie es überhaupt nicht implementieren, dann ist KVO es automatisch einwickelnd. Das hinterlässt manuelle Benachrichtigungen. Wenn Sie keine KVO-Benachrichtigungen für die Eigenschaft erhalten (und Sie treffen tatsächlich die Nachricht addObserver:forKeyPath:options:context:), deutet dies darauf hin, dass diese Klassen weder setEditing: privat implementieren noch KVO-Benachrichtigungen manuell veröffentlichen.

Daher ist die Eigenschaft nicht beobachtbar.

Wenn der einzige Weg, um etwas jemals setzt die editing Eigenschaft wird von der Steuerung eine setEditing:animated: Nachricht senden, dann können Sie setEditing:animated: außer Kraft setzen und die KVO-Benachrichtigungen, sich von Ihrer Implementierung senden, und dann wird die Eigenschaft zu beobachten sein.

+0

Danke für die informative Antwort. Ich habe die Seite gesehen, auf die Sie verlinken, aber leider erklärt sie das nicht so gut wie Sie. – Senseful