KVO使用

作者: LonelyLeaf | 来源:发表于2016-07-16 10:06 被阅读0次

KVO背景

全称为Key-Value Observing,是iOS中的一种设计模式,用于检测对象的某些属性的实时变化情况并作出响应。

使用步骤

系统框架已经支持KVO,所以程序员在使用的时候非常简单。

1. 注册,指定被观察者的属性,

2. 实现回调方法

3. 移除观察

使用方法

1、在初始化方法中加入:

[_tableView addObserver:self forKeyPath:@"contentOffset" options:NSKeyValueObservingOptionNew context:nil];

2、添加默认的响应回调方法:

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

change:(NSDictionary *)change context:(void *)context

{

if (object == _tableView && [keyPath isEqualToString:@"contentOffset"]) {

[self doSomethingWhenContentOffsetChanges];

} else {

[super observeValueForKeyPath:keyPath ofObject:object change:change context:context];

}

}

3、在dealloc中移除KVO监听:

[_tableView removeObserver:self forKeyPath:@"contentOffset" context:nil];

要注意的问题

1、KVO的陷阱

KVO有一种缺陷,KVO的add和remove必须成对出现,当对同一个keypath进行两次removeObserver时会导致程序crash。

KVO是以队列的形式管理的,即先进先出,执行remove操作时,会remove掉第一个add的KVO。

2、Context的用处

当同一个属性有两个KVO时,此时如果context值为nil,则执行remove时,便无法确保remove掉正确的KVO

对于这种情况,可以分别定义context字符串,比如第一个KVO定义context为@"FirstKVO";然后在dealloc中remove observer时指定移除的自身添加的observer。

3、UIKit不支持KVO

利用KVO来监听UITextField的text属性时,会发现在代码中设置text属性,可以响应observeValueForKeyPath函数,但如果在界面上输入文字时,却无法响应,这是因为UIKit不支持KVO机制,当用户通过键盘输入文字来改变textView的text,并非通过set方法为text赋值,也就不会触发监听事件!

如果一定要用KVO来监听的话,可以实现 TextView 的代理-(void)textViewDidChange:(UITextView *)textView;在这个代理里面加入textView.text = textView.text即可。

相关文章

  • KVO基本使用

    分三部分解释KVO一.KVO基本使用二.KVO原理解析三.自定义实现KVO 一、KVO基本使用 使用KVO,能够非...

  • KVO

    目录 1. KVO的使用1.1 KVO基本使用方法1.2 KVO手动触发模式1.3 KVO属性依赖1.4 KVO容...

  • 如何优雅地使用 KVO

    如何优雅地使用 KVO 如何优雅地使用 KVO

  • iOS原理篇(一): KVO实现原理

    KVO实现原理 什么是 KVO KVO 基本使用 KVO 的本质 总结 一 、 什么是KVO KVO(Key-Va...

  • [iOS] KVO的指导

    nshipster - KVO 如何优雅地使用 KVO

  • KVO 原理探究

    [TOC] KVO 研究 没有使用KVO和使用KVO的变化 测试的类Person 通过 objc_copyClas...

  • iOS 开发Tip2

    51.封装KVO 使用(注意:对UITextfiled使用在真机上不可以使用KVO,KVO是基于KVC,因为通过键...

  • 04. KVO使用,原理,本质

    问题 KVO日常使用 KVO原理(KVO本质是什么) 如何手动触发KVO 直接修改成员变量会触发KVO吗 KVO图...

  • iOS-KVO

    一.kvo使用 kvo可以监听一个对象属性的变化,下面为简单使用. 二.使用runtime分析kvo 我写了个简单...

  • KVO如何才能直接监听到数组的变化

    转自关于使用KVO监听数组的问题 首先,数组不能直接使用KVO使用监听。当我们想要使用KVO监听数组的状态时改变然...

网友评论

      本文标题:KVO使用

      本文链接:https://www.haomeiwen.com/subject/enqujttx.html