天天看點

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.

KVO(Key-Value Observing)

編譯運作程式,當滑動條滑動時,就調用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];

}