我正在练习“关键值观察”,但这是我不太了解的事情。

我有一个滑块(sldMoving),在移动时会假装控制台显示“已更改”。尽管还有其他方法可以做到,但我学得很好。

在-(void)viewDidLoad中很好地实现它:

[super viewDidLoad];
[self.sldMoving addObserver:self forKeyPath:@"self.sldMoving.value" options:NSKeyValueObservingOptionNew context:NULL];

并在observaValueKeyPath中:
-(Void) observeValueForKeyPath: (NSString *) keyPath ofObject: (id) object change: (NSDictionary *) change context: (void *) context {
 
  if ([keyPath isEqualToString:@"self.sldMoving.value"]) {
      NSLog(@"I Have change");

显然我写的这个废话是行不通的。

错误:

2012-08-25 20:17:07.611示例[3947:c07] *终止应用程序到期
未捕获到异常“NSUnknownKeyException”,原因:“[addObserver:
forKeyPath:@“sldMoving.value”选项:0x101上下文:0x0]已发送到
一个不兼容KVC的“sldMoving”属性的对象。
*
第一个抛出调用堆栈:(0x136b022 0x1060cd6 0x1313a48 0x13139b9 0xadc84f 0xadeb0c 0xaddd3f 0xadc6fd 0x27ff 0x28aa1e 0x1e9401 0x1e9670
0x1e9836 0x1f072a 0x1c1596 0x1c2274 0x1d1183 0x1d1c38 0x1c5634
0x2177ef5 0x133f195 0x12a3ff2 0x12a28da 0x12a1d84 0x12a1c9b 0x1c1c65
0x1c3626 0x1efd 0x1e65)终止调用引发异常

我该如何解决?

谢谢。

(对不起,我的英语不好)

最佳答案

我可以理解要学习的知识,但是您可能应该在控制器以外的东西上进行学习。通常,除非明确记录,否则UIKit不支持KVO。

如果要监视控件,则需要使用标准的控件操作API。

但是,为了帮助您了解错误的原因...

您正在尝试此代码...

[self.sldMoving addObserver:self forKeyPath:@"self.sldMoving.value" options:NSKeyValueObservingOptionNew context:NULL];

松散地翻译成这样的东西...

“是的,sldMoving,我希望您添加一个观察者对象(self)。现在,观察者想要观察此关键路径发生的情况:self.sldMoving.value,特别是新的更改。”

因此,sldMoving对象在自己内部进行查看,以查看该关键路径是否有意义。但是,这没有任何意义,因此会吐出该异常。为什么没有意义?嗯,没有办法深入到该路径,因为这些名称对UISlider没有意义。

现在,如果您将其更改为:
[self addObserver:self forKeyPath:@"sldMoving.value" options:NSKeyValueObservingOptionNew context:NULL];

您至少会成功注册。那个与self对象进行对话并希望它观察它可以执行的sldMoving.value,因为它具有KVO兼容的sldMoving(假设sldMoving是KVO兼容的,除非您以某种时髦的方式添加了它,否则我肯定是这样。而不是传统方式),并且它具有value

另外,您也可以这样做...
[self.sldMoving addObserver:self forKeyPath:@"value" options:NSKeyValueObservingOptionNew context:NULL];

现在,使用KVO时需要考虑很多陷阱,因此您应该阅读KVO编程指南:http://developer.apple.com/library/ios/#documentation/cocoa/conceptual/KeyValueObserving/Articles/KVOCompliance.html

现在,如果您在第一次单击滑块时只看到观察到的变化,请不要感到惊讶,因为您会错过所有其他值的变化...

08-26 03:18