KVO(Key-Value Observing)

參考文檔: 《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];

}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章