天天看點

KVO初體驗

從接觸iOS開發到現在已經兩年了,但是其實從來沒有仔細的學習和研究過iOS開發的相關技術,很多方法和技巧都沒有接觸過。之後在開發過程中逐漸感到現有的三腳貓功夫實在難當大任,是以決定開始補習iOS開發的各類技術。

這一篇主要是KVO的簡單使用,在這裡我直接使用了Onevcat的一個demo進行學習,原文可見:iOS中使用blend改變圖檔顔色

KVO的原理不多解釋了,很多網站都解釋的很透徹。

主要的兩個函數是

- (void)addObserver:(NSObject *)observer forKeyPath:(NSString *)keyPath options:(NSKeyValueObservingOptions)options context:(void *)context;

以及

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context

首先我在ViewController中添加了屬性color,這個也是我們需要觀察的屬性。

@property (nonatomic, strong) UIColor *color;
           

之後在ViewDidLoad中設定observer

- (void)viewDidLoad
{
    [super viewDidLoad];

    [self addObserver:self.ivStar forKeyPath:@"color" options:NSKeyValueObservingOptionNew|NSKeyValueObservingOptionOld context:NULL];
}
           

我将IBAction函數中的直接修改圖檔顔色改為修改color的value

- (IBAction)changeStarColor:(id)sender {
    [self setValue:[UIColor colorWithRed:self.redSlider.value green:self.greenSlider.value blue:self.blueSlider.value alpha:1] forKey:@"color"];
}
           

最後,在observer中實作以下函數

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{
    self.image = [self.image imageWithGradientTintColor:(UIColor *)[change objectForKey:NSKeyValueChangeNewKey]];
}
           

運作,成功!

參考網站:

iOS KVO & KVC

objc中國KVO/KVC