我正在练习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] *终止app到期 未捕获的异常'NSUnknownKeyException',原因:'[addObserver: forKeyPath:@“sldMoving.value”选项:0x101 context:0x0]被发送到 一个与“sldMoving”属性不符合KVC标准的对象。 * 第一次抛出调用堆栈:(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)终止调用抛出异常
我如何解决这个问题?
谢谢。
(对不起,我的英语不好)
答案 0 :(得分:2)
不太确定您为什么要使用observeValueForKeyPath,但您可以使用下面的代码行轻松地将更改操作附加到滑块:
[self.sliderElement addTarget:self action:@selector(didChange:) forControlEvents:UIControlEventValueChanged];
答案 1 :(得分: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
现在,如果您在第一次单击滑块时只看到观察到的更改,请不要感到惊讶,因为您将错过所有其他值更改...
答案 2 :(得分:0)
假设这是您的滑块属性:
var sliderPlayer: UISlider!
向其添加操作以观察其值变化,如下所示:
sliderPlayer.addTarget(self, action: #selector(sliderValueChanged(_:)), for: UIControl.Event.valueChanged)
您的方法应为:
@objc func sliderValueChanged(_ sender: UISlider)
{
print(sender.value)
}