美文网首页
KVO监听事件

KVO监听事件

作者: tp夕阳武士 | 来源:发表于2018-06-07 10:43 被阅读10次

    1.什么是KVO

    • KVO == (Key-Value Observing)
    • 当指定的对象中某个指定的属性的值改变的时候,此对象接收到通知的机制;
    //我们自定义一个模型类  "Person.h"
    //在.h文件中我们可以声明几个属性
    
    @interface Person : NSObject
    
    /** 年龄 */
    @property (nonatomic, assign) int age;
    /** 成绩 */
    @property (nonatomic, assign) int performance;
    /**姓名 */
    @property (strong, nonatomic) NSString *name;
    
    @end
    
    
    //随便在一个ViewController里面应用此类
    @interface PRFLabelController : UIViewController
    
    /*显示消息的label*/
    @property (nonatomic,strong) UILabel *personImformationLabel;
    /**被显示的人物对象*/
    @property (nonatomic,strong) Person *person;
    @end
    
    #import "PRFLabelController.h"
    @interface PRFLabelController ()
    
    /**最新的成绩*/
    @property (nonatomic,assign) int  newPerformance;
    /**更新成绩的按钮*/
    @property (strong, nonatomic) UIButton *updateBtn;
    @end
    
    //控制器的.m文件
    @implementation PRFLabelController
    
    - (void)viewDidLoad {
        [super viewDidLoad];
        self.view.backgroundColor = [UIColor whiteColor];
        //初始化模型对象
        self. person = [[Pserson alloc] init];
        self.person.age = 18;  //初始化属性值
        self.person.name = @"prf"; 
        self.person.performaance = 0;
    
        //指定一个新成绩
        self. newPerformance = 60;
        
        //添加kvo监听
        [self. person addObserver:self forKeyPath:@"performance" options:NSKeyValueObservingOptionNew|NSKeyValueObservingOptionOld context:NULL];  //options参数是用于指定在值修改以后,反馈回来的是新值还是旧值
        
        //初始化更新按钮 (不具体写了)
        //self.updateBtn 添加一个 updateperformance 的点击事件
    }
    
    //点击按钮时更改对象成绩
    -(void) updateperformance{
      
    //更新对象的成绩
    [self.person setValue:@(self.newperformance) forKey:@"performance"];
    //修改新成绩 <这不是必要的>
    self.newperformance +=2;
    }
    
    //Person对象监听到属性值变化后,自动执行以下方法
    -(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context{
    
    NSLog(@"%@",change);//改变的数据(包含该改变前的和改变后的数据)
        //判断修改的属性是否为performance才执行对应的时间
        if([keyPath isEqualToString:@"performance"]){
            //此处写监听到键值内容改变后想要做的对应的事情
        }
    }
    
    #pragma mark 控制器销毁的时候记得移除监听
    - (void)dealloc{
    [self.person removeObserver:self forKeyPath:@"price"];
    }
    @end
    

    相关文章

      网友评论

          本文标题:KVO监听事件

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