购物车01-搭建基本骨架
购物车02-圆角按钮处理
购物车03-显示数据
购物车04-加号减号点击处理
购物车05-通知的应用
购物车06-清空和购买
NSNotification - 通知
NSNotificationCenter - 通知中心
模拟通知
KVO 浅谈
KVO 原理
是什么?
- 使用KVO的方式实现点击➕ / ➖, 改变"总价" ?
思路
当购买数量发生改变时,就发送个通知给总价
-
在哪里添加监听呢?
- 逻辑:
- 必须为每一个
Cell的购买数量
添加监听. -
Cell的购买数量
是Wine.count
来决定得. - 那么只要对
每一个 Wine模型的count属性
添加监听即可. - Cell 里面的模型数据是从哪里来得?
从'懒加载'里,通过字典-->模型得到得。
- 必须为每一个
- 所以在"懒加载"里,给模型赋值时添加监听,那么所有Cell就有了监听了。
- 逻辑:
-
怎么区分,是点击了➕ 按钮,还是➖ 按钮?
- 添加监听时,将'以前的值'和'现在的值'一起监听.
- 响应监听时,将'以前的值'和'现在的值'拿来对比.
- 现在值(现在的购买数量) > 以前值(以前的购买数量) = 点击了➕ 按钮
-(NSArray<Wine *> *)wineData{ if (_wineData == nil) { for (NSDictionary* dic in wineArray) { .... -- KVO - 为每一个模型,添加观察者 [wine addObserver:self forKeyPath:@"count" options:NSKeyValueObservingOptionNew|NSKeyValueObservingOptionOld context:nil]; } } }
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSKeyValueChangeKey,id> *)change context:(void *)context{ int old = [change[NSKeyValueChangeOldKey] intValue]; //获取更改前的值 int new = [change[NSKeyValueChangeNewKey] intValue]; //获取更改后的值 if(new > old){ [self plusTotal:object]; -- 调用加号按钮事件 }else if(new < old){ [self minusTotal:object]; -- 调用减号按钮事件 } }
-
为什么点击清空购物车会出现负数?
- 点击清空购物车,会实现
总价 = 0,
所有购买数量为0。 - 购买数量 发生改变会触发KVO
- 引发 ➖ 按钮事件, 总价 = 总价 - 单价
也就是 总价 = 0 - 单价,所以是负数.
- 点击清空购物车,会实现
-
为什么第二次点击清空购物车, 总价为0,没有变成负数?
- 第2次点击,没有更改购买数量,也就没有触发KVO.
- 所以仅仅是将总价改为0。
解决方案: 手动修改,当总价<0时,更改为0-(void)minusTotal:(Wine *) wine { int total = self.totalLabel.text.intValue - wine.money.intValue; if(total<0){ total = 0; } .... }
-
移除监听
removeObserver: forKeyPath:
-- 移除监听 - (void)dealloc{ for (Wine *wine in self.wineData) { [wine removeObserver:self forKeyPath:@"count"]; } }