天天看点

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