2013-05-29 120 views
0

我瘋了,我在網上到處尋找,但我總是發現KVO觀察的代碼相同。然而我的observeValueForKeyPath:永遠不會被調用;這是一個簡單的代碼,我用它來觀察的UILabel taximeterValue:UILabel KVO觀察

-(id) initWithCoder:(NSCoder *)aDecoder{ 
    self=[super initWithCoder:aDecoder]; 
    if (self){ 
       [taximeterValue addObserver:self forKeyPath:@"text" options:(NSKeyValueObservingOptionNew | 
                   NSKeyValueObservingOptionOld) context:NULL]; 
    } 
    return self; 
} 


-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary*)change context:(void*)context { 
if ([keyPath isEqual:@"text"]) { 
    if (myBookingAlert) myBookingAlert.taximeterValue=self.taximeterValue; 
    NSLog(@"the text changed"); 
    // put your logic here 
} 
// be sure to call the super implementation 
// if the superclass implements it 
[super observeValueForKeyPath:keyPath 
        ofObject:object 
         change:change 
         context:context]; 

}

回答

1

一些可能的解釋:

  1. taximeterValue爲零。
  2. 沒有什麼變化taximeterValue.text
  3. 以非KVO兼容的方式改變了taximeterValue.text。對taximeterValue.text的每次更改都必須通過呼叫[taximeterValue setText:]或通過適當的willChangeValueForKey:didChangeValueForKey:消息來完成。
+0

這是一個插座,所以它可能不是零。發佈此查詢之前,我當然改變了它。此外,更改由setText完成。我沒有使用changeValueForKey函數,因爲我讀它們不是必需的。 –

+0

一個插座可以是零。事實上,在'initWithCoder:'期間,插座可能是零,因爲在nib中創建的插座連接在*'initWithCoder:'返回之後,並且在調用'awakeFromNib'之前設置。嘗試將'addObserver:...'調用移動到'awakeFromNib'。 –

+0

閱讀關於[「資源編程指南*」中的「對象加載過程」](http://developer.apple.com/library/ios/documentation/Cocoa/Conceptual/LoadingResources/CocoaNibs/CocoaNibs.html#//apple_ref/doc/uid/10000051i-CH4-SW19)。 –