8

为什么我无法观察UITableViewController实例的editing属性?观察UITableViewController的编辑属性

我用下面的代码:

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

,并实施方法:

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

...但observeValueForKeyPath方法不会被调用时,该值发生变化。


根据苹果的​​部分:

对于那些属性或一对一的关系性质,这需要你的类:

  • 实施一个名为-<key>方法,或者具有实例变量<key>_<key>
  • 如果该属性是可变的,那么它也应该执行-set<Key>:
  • 您执行的-set<Key>:方法不应执行验证。
  • 如果验证适用于密钥,则您的课程应实施-validate<Key>:error:

editing属性的文件,指出它被定义为:

@property(nonatomic, getter=isEditing) BOOL editing 

由于此属性是不可变的,唯一的子弹点必须符合是第一个(即例如,定义了一个-is<Key>方法)。您可以通过查看该属性的声明来了解它是否符合此要求,并且注意到已定义一个方法isEditing。因此,它应该是关键值观察兼容。它怎么不起作用?

+0

出于好奇,你为什么要观察属性,而不是实现'setEditing:animated:'? – 2010-09-28 21:33:06

+0

@戈登:用于与该方法相关的调试原因。 – Senseful 2010-09-29 00:05:26

回答

21

您正在混淆键值编码符合键值遵守遵守。该属性符合KVC标准,这意味着您可以使用[myViewController valueForKey:@"editing"]来访问它(如果您喜欢打字),但这并不意味着它符合KVO标准。

KVO-compliance is achieved by对象或者实现KVC兼容设定器(子弹点2和3),其KVO将包裹自动,或通过发送本身will/didChangeValueForKey:消息手动张贴KVO通知。

UIViewController和UITableViewController不公开实现setEditing:;如果他们根本没有实现它,那么KVO会自动包装它。这留下了手动通知。如果您没有收到任何有关该物业的KVO通知(并且您实际上正在碰到该消息),则表明这些类不会私下执行setEditing:,也不会手动发布KVO通知。

因此,该属性是不可观察的。

如果只有这样,任何事情的任何设置editing属性是通过发送控制器setEditing:animated:消息,那么你就可以覆盖setEditing:animated:和自己从实现发送KVO通知,然后该物业将是观察的。

+0

感谢您提供丰富的答案。我已经看到您链接到的那个页面,但不幸的是,它并没有像您那样解释它。 – Senseful 2010-09-29 00:13:31