购物车01-搭建基本骨架
购物车02-圆角按钮处理
购物车03-显示数据
是什么?
- 点击 ➕ /➖ 按钮, 数量会相应的更改。
思路:
-
点击 ➕ 按钮,直接修改控件的显示,有什么不妥的地方?
- 会引发 Cell循环利用的问题
-
为什么通过模型修改控件的显示,点击➕ 按钮'购买数量'开始没有改变,需要滑出屏幕后,再次滑入屏幕,'购买数量'才会改变 ?
如下图: Cell - 德拉克 连续点击7次➕ ,没有反应。滑出再滑入才显示购买数量。
代码如下:
- 问题关键, 就是没有"强制刷新",那怎么强制刷新呢?
- 代码是写在自定义cell里面,不是在VC里面。所以不能用
[self.tableView reloadData]; // 全局刷新
// 局部刷新
[self.tableView reloadRowsAtIndexPaths: withRowAnimation:];
-
强制刷新的本质,就是重新调用一遍
setWine
,所以我在点击➕ 按钮时,手动调用一遍,其实就等于强制刷新。-
[self setWine:_wine];
✔️ -
self.wine = self.wine;
✔️ // 挺有意思, 1 = 1是这样吗?
其实不是, 等号左边是set方法, 等号右边是get方法。
所以是, "set方法 = get方法" - 因为仅仅是需要刷新一个"购买数量",所以以上2种方法都很消耗性能, 它们都是刷新整个模型。(直接赋值一遍"购买数量"即可)
- (IBAction)plusClick:(id)sender { self.wine.count ++; //[self setWine:_wine]; //self.wine = self.wine; self.countLabel.text = [NSString stringWithFormat:@"%d",self.wine.count]; }
-
- 代码是写在自定义cell里面,不是在VC里面。所以不能用
-
在哪些情况下,需要更改➕ / ➖ 的状态 ?
- 当数量为 0 时,➖ 按钮不能点击。
- 点击 ➕ 按钮后, ➖ 按钮则可以点击。
- 需注意'Cell循环利用'的问题。
第一个Cell "德国...." 的➖ 按钮变成灰色。
第N个Cell "人头马" 的➖ 按钮也变成了灰色, 说明"人头马"Cell是引用了"德国..."Cell。
- 代码如下:
- (IBAction)minusClick:(id)sender { self.wine.count --; self.countLabel.text = [NSString stringWithFormat:@"%d",self.wine.count]; if(self.wine.count <= 0){ self.minusButton.enabled = NO; } }
- 为避免"Cell循环引用"需要在
setWine
方法里面,加上设置➖ 按钮状态的代码。( OC 语法: 非0则为YES )
当wine.count
为 0 时,minusButton.enabled = NO
-(void)setWine:(Wine *)wine{ self.minusButton.enabled = wine.count; }
➕ 的处理 (只是一些思路,不推荐实际使用)
需求
- 点击➕ 按钮, "总价"能够发生对应的改变 ?
- "总价"在VC里, ➕ 按钮在Cell里面。
- 点击➕ 按钮,在VC里面的"总价"怎么知道呢?
解决方案
-
暴力破解 (不推荐)
- 通过Automatic,得知当前
总价Label
仅仅只能在VC里访问. - 假设,在Cell类里面把VC设置为属性
@class ViewController; @interface WineCell : UITableViewCell @property (nonatomic, strong) ViewController *vcTemp; @end
- 并且,在VC类里告诉
Cell里面的VC属性
,它关联的是当前VC。
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{ .... WineCell *cell = [tableView dequeueReusableCellWithIdentifier:ID]; cell.vcTemp = self; .... }
- 那么就可以在Cell里面访问VC了,但这样有几点不好?
- Cell和VC之间太紧密了,不利于后期扩展。
- Cell依赖于VC-A,但如果需要使用其他VC时,用不了。
- 这种设计,违背了MVC / MVVM设计思想。
- 通过Automatic,得知当前
-
更改"监听事件的位置"(不推荐)
- 将在自定义Cell里面的➕ 点击事件,放在VC里面
这样,总价Label
在VC里, ➕ 按钮点击事件,也在VC里面
所以,可以实现点击➕ ,更改总价Label
- 现在只需要在➕ 按钮点击事件里面,获取到
自定义Cell
, 就能实现,根据'购买数量 * 单价',得到对应的 总价 - 怎么获取
自定义Cell
?-
sender
传递的是当前的按钮. - 根据设计的UI结构,可以看出
sender.superview
是UITableViewCellContentView
sender.superview.superview
是WineCell
,
所以就得到了自定义的Cell
-
- 代码如下:
- (IBAction)plusClick:(UIButton *)sender { NSLog(@"grandfather:%@",sender.superview.superview); WineCell * wineTemp = (WineCell*)sender.superview.superview; wineTemp.wine.count ++; int money = [wineTemp.wine.money intValue]; int num = wineTemp.wine.count; self.totalLabel.text = [NSString stringWithFormat:@"%d",money*num]; [self.tableView reloadData]; // 全局刷新 }
- 缺陷:
- 太依赖于,层次结构了! 如果在UI界面,再次"添加 / 减少 View"
那么sender.superview.superview
得到的就不是自定义Cell
- 太依赖于,层次结构了! 如果在UI界面,再次"添加 / 减少 View"
- 将在自定义Cell里面的➕ 点击事件,放在VC里面
网友评论