2012-08-25 57 views
4

我正在練習與關鍵值觀察,但這是我不明白的東西。一些幫助關鍵值觀察與滑塊

我有一個滑塊(sldMoving),當它移動時,假設控制檯顯示「已經改變」。雖然還有其他方法可以做到,但我很好學習。

在 - (無效)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 Example[3947:c07] * Terminating app due to uncaught exception 'NSUnknownKeyException', reason: '[ addObserver: forKeyPath:@"sldMoving.value" options:0x101 context:0x0] was sent to an object that is not KVC-compliant for the "sldMoving" property.' * 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

我該如何解決這個問題?

謝謝。

(請原諒我的英語不好)

回答

1

我可以理解想要學習,但你應該在控制器以外的其他地方做。一般來說,UIKit不支持KVO,除非明確記錄。

如果要監視控件,則需要使用標準控件操作API。

但是,以幫助您瞭解什麼是你的錯誤發生...

您正試圖驗證碼...

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

鬆散地轉化爲這樣的事情...

「Yo,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]; 

現在,有一堆陷阱的使用志願時,要考慮那麼你真的應該讀志願編程指南:http://developer.apple.com/library/ios/#documentation/cocoa/conceptual/KeyValueObserving/Articles/KVOCompliance.html

現在,如果您僅在第一次單擊滑塊時纔看到觀察到的更改,則不會感到驚訝,因爲您將錯過所有其他值更改...

+0

謝謝你的解釋。這項工作! – ivamago

2

不明白爲什麼你想要使用observeValueForKeyPath,但你可以很容易地附加變化行動的滑蓋下面的代碼行:

[self.sliderElement addTarget:self action:@selector(didChange:) forControlEvents:UIControlEventValueChanged]; 
+0

有時候使用KVO會有所幫助,因爲它允許更好地解耦UI和應用程序GIC。如果可以通過觸摸和編程方式更改滑塊,也可能很有用 - 當滑塊的值以編程方式更改時,UIControlEvent不會觸發,但觀察者將其選中。 – SaltyNuts