先说一些关于@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的监听就完成了