美文网首页
-willMoveToSuperview: && KVO

-willMoveToSuperview: && KVO

作者: unspecx | 来源:发表于2019-01-10 17:07 被阅读0次

在处理子视图监听父视图属性变化时,-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告知子视图,此时参数newSuperviewnil,但是子视图的父视图不为nil,所以[self.superview removeObserver:self forKeyPath:@"contentOffset"];恰当的移除了注册的观察者,合理地保证了注册和移除一一对应。

相关文章

网友评论

      本文标题:-willMoveToSuperview: && KVO

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