Beobachten der Editiereigenschaft eines UITableViewControllers

9

Warum kann ich die Eigenschaft editing einer Instanz von UITableViewController nicht beobachten?

Ich verwende den folgenden Code:

%Vor%

Und haben die Methode implementiert:

%Vor%

... aber die Methode observeValueForKeyPath wird niemals aufgerufen, wenn sich dieser Wert ändert.

Laut Apples Abschnitt KVC-Compliance sicherstellen :

  

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

     
  • Implementieren Sie eine Methode namens -<key> , -is<Key> oder haben Sie eine Instanzvariable <key> oder _<key> .
  •   
  • Wenn die Eigenschaft änderbar ist, sollte auch -set<Key>: implementiert werden.
  •   
  • Ihre Implementierung der Methode -set<Key>: 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 Eigenschaft editing besagt, dass sie wie folgt definiert ist:

%Vor%

Da diese Eigenschaft nicht veränderbar ist, muss der einzige Punkt, dem sie entsprechen muss, der erste sein (d. h. dass beispielsweise eine -is<Key> -Methode definiert ist). Sie können sehen, dass dies dem 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?

    
Senseful 28.09.2010, 21:09
quelle

1 Antwort

22

Sie verwechseln die Übereinstimmung von Schlüsselwert Codierung mit der Einhaltung von Schlüsselwerten Beobachtung . 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.

KV O -Kompliance wird erreicht durch das Objekt, das entweder einen KVC-konformen Setter implementiert (Aufzählungspunkte 2 und 3), den KVO automatisch umbricht, oder manuell KVO-Benachrichtigungen sendet, indem er sich selbst will / didChangeValueForKey: Nachrichten sendet.

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 tatsächlich die Nachricht addObserver:forKeyPath:options:context: treffen), deutet dies darauf hin, dass diese Klassen weder setEditing: noch KVO-Benachrichtigungen manuell implementieren.

Daher ist die Eigenschaft nicht beobachtbar.

Wenn die editing -Eigenschaft überhaupt nur durch das Senden einer setEditing:animated: -Nachricht an den Controller festgelegt wird, können Sie setEditing:animated: überschreiben und die KVO-Benachrichtigungen selbst von Ihrer Implementierung senden. Dann ist die Eigenschaft beobachtbar .

    
Peter Hosey 28.09.2010, 22:10
quelle