參考文檔: 《Cocoa Programming for Mac OS X 4》
上一篇講解KVC中,假如sliderNumber的值不是被滑動條改變而是被其他對象改變,那麼滑動條如何知道sliderNumber有了一個新的值勒?
當滑動條建立後,綁定到self.sliderNumber,它就告訴KVCAppDelegate對象,它正在觀察sliderNumber,當sliderNumber的值KVO間接觸發accessor方法或者直接觸發accessor方法改變後,KVCAppDelegate就發送一個消息給滑動條,告訴它,sliderNumber的值已經被改變了,然後滑動條就會及時更新這個值。
在MainMenu.xib中添加一個文本框,用來顯示sliderNumber的值,并且綁定到self.sliderNumber.

編譯運作程式,當滑動條滑動時,就調用setSliderNumber方法,通知文本框sliderNumber的值改變了,文本框就調用ValueForKey來擷取新的sliderNumber的值,于是sliderNumber方法就被調用了.
如果直接改變變量的值,會怎麼樣勒?
添加一個Button到MainMen.xib,然後聲明一個新的action方法:
- (IBAction)incrementSliderNumber:(id)sender
{
sliderNumber++;
NSLog(@"slideNumber now is %d",sliderNumber);
}
此時,編譯運作程式,點選按鈕,期望的是,滑動條和文本框的資料都會更新,但是什麼都沒有發生。
此時解決方法:
1: 就是顯式的通知觀察者
2:使用KVC來改變
3:使用accessor方法來改變
對- (IBAction)incrementSliderNumber:(id)sender做如下修改:
- (IBAction)incrementSliderNumber:(id)sender
{
//顯式通知觀察者
[self willChangeValueForKey:@"sliderNumber"];
sliderNumber++;
NSLog(@"slideNumber now is %d",sliderNumber);
[self didChangeValueForKey:@"sliderNumber"];
//使用KVC來改變
// NSNumber *n = [self valueForKey:@"sliderNumber"];
// NSNumber *nPlusPlus = [NSNumber numberWithInt:[n intValue] + 1];
// [self setValue:nPlusPlus forKey:@"sliderNumber"];
//使用accessor方法來修改
// [self setSliderNumber:[self sliderNumber] + 1];
}