观察UITableViewController的编辑属性

Sen*_*ful 9 cocoa-touch objective-c key-value-observing key-value-coding uikit

为什么我不能观察editing实例的属性UITableViewController

我正在使用以下代码:

[self addObserver:self 
       forKeyPath:@"editing" 
          options:(NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld)
          context:NULL];
Run Code Online (Sandbox Code Playgroud)

并实施了该方法:

- (void)observeValueForKeyPath:(NSString *)keyPath
                      ofObject:(id)object
                        change:(NSDictionary *)change
                       context:(void *)context
Run Code Online (Sandbox Code Playgroud)

...但是observeValueForKeyPath当该值改变时,永远不会调用该方法.


根据Apple的" 确保KVC合规性"部分:

对于属性或一对一关系的属性,这需要您的类:

  • 实现名为-<key>,, -is<Key>或具有实例变量<key>或的方法_<key>.
  • 如果属性是可变的,那么它也应该实现-set<Key>:.
  • 您的-set<Key>:方法实现不应执行验证.
  • -validate<Key>:error:如果验证适合密钥,则应该实现您的类.

editing属性的文档声明它被定义为:

@property(nonatomic, getter=isEditing) BOOL editing
Run Code Online (Sandbox Code Playgroud)

由于此属性不可变,因此它必须符合的唯一要点是第一个(-is<Key>例如,定义了一个方法).您可以通过查看属性声明并注意到已isEditing定义方法来确定它是否符合此要求.因此,它应该符合Key Value Observing.怎么不工作?

Pet*_*sey 22

您将Key-Value Coding合规性与Key-Value Observing合规性相混淆.该属性符合KVC标准,这意味着您可以使用[myViewController valueForKey:@"editing"]它来访问它(如果您喜欢打字),但这并不意味着它符合KVO标准.

KV O兼容性是通过实现符合KVC的设置器(子弹点2和3),KVO将自动包装,或通过发送自身will/ didChangeValueForKey:消息手动发布KVO通知来实现的.

UIViewController和UITableViewController不公开实现setEditing:; 如果他们根本没有实现它,那么自动包装它的KVO就会消失.这留下了手动通知.如果您没有收到该属性的任何KVO通知(并且您实际上正在点击该addObserver:forKeyPath:options:context:消息),则表明这些类既不是私有实现setEditing:也不是手动发布KVO通知.

因此,该财产是不可观察的.

如果任何设置editing属性的唯一方法是向控制器发送setEditing:animated:消息,那么您可以setEditing:animated:自己覆盖并从您的实现中发送KVO通知,然后该属性将是可观察的.