美文网首页
KVO—手动触发

KVO—手动触发

作者: 一叶知秋0830 | 来源:发表于2019-12-17 15:34 被阅读0次
    // Student.h
    @interface Student : NSObject
    
    @property (nonatomic , assign) NSInteger score;
    
    - (void)changeScore:(NSInteger)score;
    
    @end
    
    
    // Student.m
    #import "Student.h"
    @implementation Student
    // 改变成员变量的值
    - (void)changeScore:(NSInteger)score{
        _score = score;
    }
    
    @end
    

    如上所示的Student类有个score属性,通过KVO添加观察者监听score属性后,可以通过下面3中方式来改变score的值,但只有通过.语法和KVC赋值这两种方式改变score的值时才会触发KVO

    Student *stu = [[Student alloc] init];
    [stu addObserver:self forKeyPath:@"score" options:NSKeyValueObservingOptionNew context:NULL];
    
    // 通过3中方式改变score
    // 方式一:点语法(也就是通过setter方法赋值)
    stu.core = 88;
    
    // 方式二:KVC赋值
    [stu setValue:@55 forKey:@"score"];
    
    // 方式三:直接更改成员变量的值(不会触发KVO)
    [stu changeScore:33];
    
    

    如果想要第三种方式也能触发KVO的话就需要手动触发,也就是需要将changeScore:方法改成:

    - (void)changeScore:(NSInteger)score{
    
        [self willChangeValueForKey:@"score"];
        _score = score;
        [self didChangeValueForKey:@"score"];
    }
    

    相关文章

      网友评论

          本文标题:KVO—手动触发

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