一、你可能遇到过的问题
Question 1.使用UITextField时;
当你想时时监测textField.text的变化,以获取最新的text,你是用这样的代理方法吗?
1 | - (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string { |
Question 2.使用UIWebView或WKWebView时;
由于网页端用Ajax,导致我们并不能用常规的网页加载代理方法来检测webView的title的值~比如这样1
2
3
4
5
6- (void)webView:(WKWebView *)webView didFinishNavigation:(WKNavigation *)navigation {
if (webView.title.length > 0) {
self.title = webView.title;
}
}
二、这里我们就需要用上观察者模式了
KVO,即key-value-observing,利用一个key来找到某个属性并监听其值得改变。其实这也是一种典型的观察者模式。
- 1,添加观察者
- 2,在观察者中实现监听方法,observeValueForKeyPath: ofObject: change: context:(因为这个方法属于NSObject,所以,可以用于检测任何对象的任何属性的变化)
- 3,移除观察者
1 | /** |
三、解决上述及类似的问题
Answer 1
1 | [self.textField addTarget:self action:@selector(textFieldDidChange:) |
Answer 2
1 | /** |
附:再来一发监听UITableView的contentOffset
1 | - (void)configObserverForTableView { |
看到这里大家一定就能明白观察者模式的基本套路了吧,心里突然响起了音乐:”其实很简单,其实很自然”~
四、写在最后
- 此方法可用于监听一切对象的属性变化,包括系统的类(UITableView、UIWebView等)和自定义的类(User、Car等)
- 上面的User类是通例,属于基本模型,实际情况有需求而定
- 还可以用于监听动画的特殊时刻,比如:frame、color等变化
- 一定记得在析构函数里移除监听;
- 一定记得在析构函数里移除监听;
- 一定记得在析构函数里移除监听……