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的监听就完成了

  • 相关阅读:
    Promise.all和Promise.race区别,和使用场景
    使用Promise解决多层异步调用的简单学习【转】
    前端性能优化-缓存
    Node.js机制及原理理解初步【转】
    微信小程序 canvas 字体自动换行(支持换行符)
    百度地图-鼠标悬停样式
    文件I/O相关函数
    获取系统限制信息
    标准C头文件
    数据库系统小结:(不包括详细知识点,更像一个大纲)
  • 原文地址:https://www.cnblogs.com/mdurant/p/5302159.html
Copyright © 2011-2022 走看看