起初設想在控制器上面新建一個UITextfield,通過KVO監聽輸入text的變化。將變化后的值顯示在控制器的label上面。代碼如下。
```
[self.stockTextFieldaddObserver:selfforKeyPath:@"text"options:NSKeyValueObservingOptionNew|NSKeyValueObservingOptionOldcontext:nil];
-(void)observeValueForKeyPath:(NSString*)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void*)context{
if([keyPathisEqualToString:@"text"] &&object ==self.stockTextField)
{self.valueLabel.text= [changevalueForKey:@"new"];}
}
```
##希望在控制器上輸入改變的時候能順利的看到跳到observeValueForKeyPath的方法中,結果是KVO無法進行觀察。分析原因:通過換一種方式對text的值做改變,增加一個按鈕,在每次點擊按鈕之前對text的值做改變。
```
- (IBAction)btnClick:(UIButton*)sender {
self.stockTextField.text= [NSStringstringWithFormat:@"%ld",_num++];;
}
```
在這種情況下,會跳到observeValueForKeyPath方法中。至此,查看KVO的原理,即可初步懷疑原因,textfield輸入的話是直接_text = @"123456"的賦值方式,而沒有調用-(void)setText:(NSString *)text方法,所以發送通知進而進入observeValueForKeyPath:。直接觀察者觀察的是屬性,只有遵循 KVO 變更屬性值的方式才會執行KVO的回調方法,例如是否執行了setter方法、或者是否使用了KVC賦值。如果賦值沒有通過setter方法或者KVC,而是直接修改屬性對應的成員變量,例如:僅調用_text = @"123",這時是不會觸發kvo機制,更加不會調用回調方法的。所以使用KVO機制的前提是遵循 KVO 的屬性設置方式來變更屬性值。

