zoukankan      html  css  js  c++  java
  • iOS 中KVO的那点事

    今天遇到点关于KVO小问题,纠结了半天.结果是出来了.

    需求:监听UITableView数据的变化,一旦变化,就刷新UITableView.

    很显然要用到KVO.数据是放到

    @property (nonatomic, strong) NSMutableArray* data;

    刚开始我是这么做的:

    1,注册监听

    - (void)viewDidLoad {

        [super viewDidLoad];

        //KVO监听data的变化

        [self addObserver:self forKeyPath:@"data" options:0 context:nil];

        

    }

     2,重写:observeValueForKeyPath:ofObject:change:context:

    - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context {

        //刷新

        [self.tableView reloadData];

    }

    3,改变self.data的值...

    [self.data addObject:[NSString stringWithFormat:@"你好"]];

    4,结果:没有反应!!!!

    弄了半天才发现少东西.在KVO中,有两种类型:手动通知与自动通知.上面的通知没有反应,是因为这是一个手动通知,所以在属性改变时要在前后分别加上这两个方法: willChangeValueForKey:,didChangeValueForKey:.在自动通知中,可以不用加这两个方法.

    在第三部修改为以下方式,就OK了.

    [self willChangeValueForKey:@"data"];

    [self.data addObject:[NSString stringWithFormat:@"%d",indexPath.row]];

     [self didChangeValueForKey:@"data"];

    具体原因,看文档.

    当然了,如果在你的app中需要把某个属性的自动通知改成改成手动通知的奇葩需求的时候.也不是不行的.重写以下NSObject的这个类方法就ok了:

    automaticallyNotifiesObserversForKey.biru:

    + (BOOL)automaticallyNotifiesObserversForKey:(NSString *)key{

      //将backgroundColor属性的自动通知变成手动通知

        if ([key isEqualToString:@"backgroundColor"]) {

            return NO;

        }

        return [super automaticallyNotifiesObserversForKey:key];

    }

    参考博客:http://www.cnblogs.com/pengyingh/articles/2383629.html

  • 相关阅读:
    动态规划算法介绍——概念、意义及应用、例题
    两个大数相减
    删除apache的签名的shell脚本
    C++中智能指针的设计和使用
    eclipse save action不起作用
    [leetcode]51. N-QueensN皇后
    [leetcode]33. Search in Rotated Sorted Array旋转过有序数组里找目标值
    [leetcode]88. Merge Sorted Array归并有序数组
    [leetcode]636. Exclusive Time of Functions函数独占时间
    [leetcode]257. Binary Tree Paths二叉树路径
  • 原文地址:https://www.cnblogs.com/iOS771722918/p/4460010.html
Copyright © 2011-2022 走看看