zoukankan      html  css  js  c++  java
  • iOS KVO的一些理解和使用

    先说一些关于@interface的(复制了一个说的很完整的)

    此@interface部分为类扩展(extension)。

    其被设计出来就是为了解决两个问题的,其一,定义类私有方法的地方。其二,实现public readonly,private readwrite的property(意思是在h头文件中定义一个属性对外是readonly的,但在类的内部希望是可读写的,所以可以在m源文件中的@interface部分重新定义此属性为readwrite,此时此属性对外是只读的,对内是读写的)。

    此外,也可在此部分申明变量和属性,但申明的变量,属性和方法均为私有的,只能够被当前类访问,相当于private。

    我的例子使用KVO主要是需求上有页面的值需要动态变化,KVO监听和delegate配合使用完美解决这类问题。当然是有更好的省内存的写法,我这里使用KVO+delegate为例

    KVO的使用大致分三步

    1

    addObserver:self
               forKeyPath:@"xxx"
                  options:NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld
                  context:NULL];
    

     给你的属性添加监听。需要注意的是KVO实际是观察的地址变化,如果这里是数组或者float等类型,kvo是实现不了得

    注意2:如果使用string类型这个非常特殊的类型的话,keypath就是你的属性名,[self addobserver...]这样的方式来调用

    tips:如果发生莫名的崩溃,请去检查是否初始化你的string类型的属性

    2

    - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSString *,id> *)change context:(void *)context {
        if ([keyPath isEqualToString:@"xxx"]) {
            if (self.delegate) {
                if ([self.delegate respondsToSelector:@selector(CartConfirmOrderExpressAddTableViewCell:expressAddPrice:)]) {
                    [self.delegate CartConfirmOrderExpressAddTableViewCell:self expressAddPrice:self.expressAddPrice];
                }
            }
        }   
    }
    

     这是监听的实现,当监听到属性变化时调用。这里的delegate可以先不看,是配合kvo实现,下面会写出来

    3

            [self removeObserver:self forKeyPath:@"expressAddPrice"];
    

     remove是必须实现的,写在-dealloc里面

    以上是kvo三步,可以先把方法写出来,实现部分在写完delegate的定义只有填写。kvo的实现部分是为了触发delegate的实现,delegate的实现里面完成我们的需求

    delegate部分

    @protocol xxxDelegate <NSObject>
    

     在.h定义一个delegate

    - (void)xxxxTableViewCell:(CartConfirmOrderExpressAddTableViewCell *)cell expressAddPrice:(NSInteger )price;
    

     定义方法,这里根据自己需要写,但是一般会把cell传过去,可以得到cell的分区和行的定位 后面那个就是传过去改变的属性

    @property(nonatomic, weak) id<CartConfirmOrderExpressAddDelegate> delegate;
    这个别忘了,留给你的子类遵守

    然后就是进入controller里面,遵守下协议之后,找个地方实现协议的内容了。

    这样KVO+delegate的监听就完成了

  • 相关阅读:
    【redis源码】(三)Zipmap
    【redis源码】(五)Ziplist
    mint 13 安装 phpunit
    【php】nginx phpfpm “session锁”问题
    linux 系统下 恢复被误删文件
    【python】python相关的那些事【一】python 中的变量
    【redis源码】(八) Intset.c
    【python】【scrapy】使用方法概要(三)
    【redis源码】(六)Ae.c
    【c++】关于默认构造函数
  • 原文地址:https://www.cnblogs.com/mdurant/p/5302159.html
Copyright © 2011-2022 走看看