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:
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?
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 .
Tags und Links objective-c key-value-coding cocoa-touch key-value-observing uikit