4

我正在练习 Key Value Observing,但我不太了解。

我有一个滑块 (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" options:0x101 context:0x0] 已发送到“sldMoving”属性不符合 KVC 的对象。* First throw call stack: (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) terminate called throwing an exception

我该如何解决这个问题?

谢谢你。

(请原谅我的英语不好)

4

3 回答 3

2

不太清楚为什么要使用 observeValueForKeyPath,但您可以使用下面的代码行轻松地将更改操作附加到滑块:

[self.sliderElement addTarget:self action:@selector(didChange:) forControlEvents:UIControlEventValueChanged];
于 2012-08-25T18:34:36.227 回答
1

我可以理解想要学习,但您可能应该在控制器以外的其他东西上学习。一般来说,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

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

于 2012-08-25T20:26:42.860 回答
0

斯威夫特 5

假设这是您的滑块属性:

var sliderPlayer: UISlider! 

向其添加操作以观察其值变化,如下所示:

sliderPlayer.addTarget(self, action: #selector(sliderValueChanged(_:)), for: UIControl.Event.valueChanged)

你的方法应该是这样的:

@objc func sliderValueChanged(_ sender: UISlider)
{
    print(sender.value)
}
于 2020-11-24T13:40:25.023 回答