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通知,然后该属性将是可观察的.
| 归档时间: |
|
| 查看次数: |
1691 次 |
| 最近记录: |