KVO

作者: min369 | 来源:发表于2017-09-01 00:32 被阅读12次

    使用KVO的要求是对象必须能支持kvc机制——所有NSObject的子类都支持这个机制。
    1.一般使用

    //添加监听者
    [self.tableView addObserver: self forKeyPath: @"frame" options: NSKeyValueObservingOptionNew context: nil];
    //监听属性值发生,改变时回调
    - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context {
    }
    

    2.如果一个属性是由其他几个属性决定,如firstName + lastName = fullName。fullName是由firstName和lastName决定的,想要监听fullName的变化,那么当firstName和lastName改动的时候,该值必须被通知
    除了实现上面的基本方法,还要实现下面方法

    + (NSSet *)keyPathsForValuesAffectingValueForKey:(NSString *)key {
        NSSet *keyPaths = [super keyPathsForValuesAffectingValueForKey:key];
        if ([key isEqualToString:@"fullName"]) {
            NSSet *affectingKeys = [NSSet setWithObjects:@"lastName", @"firstName",nil];
            keyPaths = [keyPaths setByAddingObjectsFromSet:affectingKeys];
        }
        return keyPaths;
    }
    

    个人理解:在[xxx addObserver: self forKeyPath: @"fullName" options: NSKeyValueObservingOptionNew context: nil];建立观察者方法时候,会调用+ (NSSet *)keyPathsForValuesAffectingValueForKey:(NSString *)key方法,将其key扩充了
    “lastName”和“firstName”,所以当firstName和lastName都会调用
    - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context方法

    相关文章

      网友评论

          本文标题:KVO

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