在处理子视图监听父视图属性变化时,-willMoveToSuperview:
是处理KVO注册和移除逻辑的比较好的时机。
如下示例:
- (void)willMoveToSuperview:(UIView *)newSuperview
{
if(newSuperview && ![newSuperview isKindOfClass:[UIScrollView class]]){
return;
}
[self.superview removeObserver:self forKeyPath:@"contentOffset"];
if(newSuperview){
self.scrollView = (id)newSuperview;
[self.scrollView addObserver:self
forKeyPath:@"contentOffset"
options:NSKeyValueObservingOptionNew
context:kJKRefreshVieCcontext];
}
}
说明
- 子视图在将要被加到父视图时,系统会通过
willMoveToSuperview
告知子视图,此时参数newSuperview
不为nil
,且newSuperview
即为子视图的父视图- 首次添加时可以忽略移除注册的代码
[self.superview removeObserver:self forKeyPath:@"contentOffset"];
,仅仅给父视图发个移除观察者的消息而已,如果观察者无效,忽略消息,但是这行代码很有用,如下。- 当子视图被移除时,系统依然会通过
willMoveToSuperview
告知子视图,此时参数newSuperview
为nil
,但是子视图的父视图不为nil
,所以[self.superview removeObserver:self forKeyPath:@"contentOffset"];
恰当的移除了注册的观察者,合理地保证了注册和移除一一对应。
网友评论