新浦京81707con > 首页 > 老葡京娱乐平台购物车的逻辑及处理,两个代理

原标题:老葡京娱乐平台购物车的逻辑及处理,两个代理

浏览次数:96 时间:2020-04-05

上次写完购物车精短版被编辑推荐到了首页,获得众多情人关怀,争论区小友人建议做一个一体化版.于是利用空闲时间新扩展了有个别功效:

正常的cell:只说下label中写道的完毕

part one 全选开关有关代码

代办方法1中伪代码:

#pragma mark - cell上的代理方法- shopCellSelectedClick:(NSInteger)shopCellTag {....///插入判断代码//判断 //cell改变组头 //组头改变全选 NSInteger selectedNum = 0 ; for (MKOrderListModel * tempListModel in _modelArray) {//遍历所有组 if (tempListModel.groupSelected) {//如果组头是选中的 selectedNum  = 1; } if (selectedNum == _modelArray.count) { allSelectBtn.selected = YES; } } } else { listModel.groupSelected = NO; allSelectBtn.selected = NO; }....}

cell的当选扩充了判定代码,决定全选按键的景况

一体化代码:

#pragma mark - cell上的代理方法获 | 取的价格- shopCellSelectedClick:(NSInteger)shopCellTag { //判断组的是否选中状态是否修改 NSString * cellTagStr = [NSString stringWithFormat:@"%zd",shopCellTag]; NSIndexPath *indexPath = self.dic[cellTagStr]; MKOrderListModel * listModel = (MKOrderListModel*)_modelArray[indexPath.section]; //0.便利当前组cell上选中按钮的个数 NSInteger seletedNum =0; for (MKGoodsModel* goodsModel in listModel.goods) { if (goodsModel.isSelected) { seletedNum  = 1; } // 1.当前组的cell的个数 是否等于 勾选的总数 if (((MKOrderListModel*)_modelArray[indexPath.section]).goods.count == seletedNum) { listModel.groupSelected = YES; //cell改变组头变为选中 //判断 //cell改变组头 //组头改变全选 NSInteger selectedNum = 0 ; for (MKOrderListModel * tempListModel in _modelArray) {//遍历所有组 if (tempListModel.groupSelected) {//如果组头是选中的 selectedNum  = 1; } if (selectedNum == _modelArray.count) { allSelectBtn.selected = YES; } } } else { listModel.groupSelected = NO; allSelectBtn.selected = NO; } [_tableView reloadData]; } MKGoodsModel *goodsModel = ((MKOrderListModel*)_modelArray[indexPath.section]).goods[indexPath.row]; float goods_price = goodsModel.goods_price; float goods_number = goodsModel.goods_number; if (!goodsModel.isSelected) { _totalNum = _totalNum - goods_price*goods_number;// NSLog(@"%.2f",_totalNum); }else { _totalNum = _totalNum   goods_price*goods_number;// NSLog(@"%.2f",_totalNum); } _hejiLabel.text = [NSString stringWithFormat:@"¥%.2f",_totalNum -1   1]; if ([_hejiLabel.text containsString:@"-"]) { _hejiLabel.text = @"¥0.0"; }}

一时一刻cell选中时候,当前组头也相中的时候,决断当前怀有选中组的个数是不是等于一切组数

代理方法第22中学伪代码:

#pragma mark - 代理方法组头header的选中状态- headerSelectedBtnClick:(NSInteger)section {...插入判断// 判断如果点击 | header选中 if (listModel.groupSelected) { // /// 判断组头的点击改变全选按钮 NSInteger tempGroupSelectNum = 0; for (MKOrderListModel *model in _modelArray) { if (model.groupSelected) { tempGroupSelectNum   ; } if (tempGroupSelectNum == _modelArray.count) { allSelectBtn.selected = YES; } }...}

数组的当选开关中增加判别

完全代码:

#pragma mark - 代理方法组头header的选中状态- headerSelectedBtnClick:(NSInteger)section { // NSLog(@"%zd",section); MKOrderListModel*listModel = _modelArray[section]; listModel.groupSelected = !listModel.groupSelected; // 判断如果点击 | header选中 if (listModel.groupSelected) { // /// 判断组头的点击改变全选按钮 NSInteger tempGroupSelectNum = 0; for (MKOrderListModel *model in _modelArray) { if (model.groupSelected) { tempGroupSelectNum   ; } if (tempGroupSelectNum == _modelArray.count) { allSelectBtn.selected = YES; } } for (MKGoodsModel* goodsModel in listModel.goods) { if (!goodsModel.isSelected) { //下面不是选中状态的cell 将价格加入到总价当中 float goods_price = goodsModel.goods_price; //价格 float goods_number = goodsModel.goods_number; // 数量 _totalNum  = goods_price * goods_number; goodsModel.isSelected = YES; } } } else { // 取消header选中 所有都取消 //全选按钮变为不选中 allSelectBtn.selected = NO; for (MKGoodsModel* goodsModel in listModel.goods) { goodsModel.isSelected = NO; float goods_price = goodsModel.goods_price; //价格 float goods_number = goodsModel.goods_number; // 数量 _totalNum -= goods_price * goods_number; } }// NSLog(@"总价格为: %.2f",_totalNum); _hejiLabel.text = [NSString stringWithFormat:@"¥%.2f",_totalNum - 1   1]; if ([_hejiLabel.text containsString:@"-"]) { _hejiLabel.text = @"0"; } [_tableView reloadData];}

全选按键的点击管理:

/// MARK: 全选的点击事件- allSelectBtnClick: (UIButton*)allSelectedBtn{ allSelectedBtn.selected = !allSelectedBtn.selected; // 修改全选按钮的状态 if (allSelectedBtn.selected) { // 如果全选按钮改变了为选中 for (int i = 0; i <_modelArray.count; i   ) { MKOrderListModel * listModel = _modelArray[i]; if (!listModel.groupSelected) {//遍历如果组不是选中状态 [self headerSelectedBtnClick:i]; //模拟组头点击了一次 } } }else { // 全选按钮改变为不选中 那么所有商品都不选中! for (int i = 0; i < _modelArray.count; i   ) { // 遍历所有的组头点击 [self headerSelectedBtnClick:i]; } }}

点击全选,按键状态取反取反后,全选开关是选中,则遍历全部组把装有未选中的组头做壹回点击操作取反后,全选按键是未选中,则具备组头做一回点击操作就可以

匡正数量效果展示:

老葡京娱乐平台 1改善数量效果

商品数量用的是第三方PPNumberButton,点击时改动model中该商品的实际上数目;点击商品连串举行重复选取(方法未兑现,原理同样);点击删除进行cell的删减及数据源的删除。

github代码:

即,依据代理中的tag 收取 indexpath 再依照indexpath 收取模型中的数据此外推断本组中的cell都当选时候组的当选状态也为当选!

购物车逻辑及贯彻计算

逻辑收拾:当我们把有买入意向的物料加到购物车的前面,大家在购物车中调用接口获取购物车中的货物音讯。数据源格式大致是(认为微微对,可是能精晓就能够)

[

{@“商铺消息”:[@{物品音讯},@{货物音信},@{货色音讯}]}, -------》组一

{@"商店新闻":[@{物品消息}]}, -------》组二

{@”商号音信“:[@{物品音讯},@{货色音讯}]} -------》组三

]

把多少源用model装起来,把数据填充到tableview中去。

1.单个商品的取舍、单个公司内装有商品的挑精拣肥、买单栏下的全选

假定做得超级轻松的话,能够一贯用系统的单选和全选方法。

最关键的两句 !!!!

Table德姆o.editing=YES; 编辑状态

TableDemo.allowsMultipleSelectionDuringEditing=YES; 编辑的时候多选

cell.tintColor= [UIColorredColor]; 选中后的水彩

当选和撤回选中

-tableView:(UITableView*)tableView didSelectRowAtIndexPath:(NSIndexPath*)indexPath 选中

-tableView:(UITableView*)tableView didDeselectRowAtIndexPath:(NSIndexPath*)indexPath 注销选中

老葡京娱乐平台 2全选效果呈现

提出利用梅森ry举办cell适配

  • 数据加减
  • 可点击textField校订,也足以加减开关校订
  • 全选开关

老葡京娱乐平台 3计算机手艺研究所选中物品的总价值格

全选按键逻辑效果:

<UITableViewDelegate,UITableViewDataSource,shopCarCellDelegate,headerViewDelegate>

// 注册cell/header 或者判断为空的时候 创建 UINib * nib = [UINib nibWithNibName:@"MKShopCarCell" bundle:nil]; [_tableView registerNib:nib forCellReuseIdentifier:@"shop"];

老葡京娱乐平台 4

老葡京娱乐平台 5首页图

  • 1

demo中的数据源小编从未放置model中去处理,其实原理都一律,笔者把决断各种按键的论断字段加到数据源中去了,假如用model模型的话,本人丰硕相呼应的字段,并设置伊始值。当举办model数据源的修改时,直接举办改过。

part two 改革数量相关代码:

关于购物车中textField的逻辑代码可查看本人的另一篇记用了市斤个if做的textField输入框的非常须求这里贴一下数据加减的代码:

/// MARK:数量增加按钮- plusBtnClick { if (_ex_buynum_texField.editing) { return; } // 保存之前值 float beforeBuyNum = _goodsModel.goods_number; // 判断不能大于20 if (_ex_buynum_texField.text.floatValue == 20) { return; } /// 修改模型数据 _ex_buynum_texField.text = [NSString stringWithFormat:@"%.1f",_ex_buynum_texField.text.floatValue   0.5]; _goodsModel.goods_number = _ex_buynum_texField.text.floatValue; if ([self.shopDelegate respondsToSelector:@selector(shopCellEndEditerClick:beforeBuyNum:)]) { [self.shopDelegate shopCellEndEditerClick:self.tag beforeBuyNum:beforeBuyNum]; } /// 传递给服务器 一会写 $$$$$$$$}- reduceBtnClick { if (_ex_buynum_texField.editing) { return; } // 保存之前值 float beforeBuyNum = _goodsModel.goods_number; // 判断不能小于0.5 if (_ex_buynum_texField.text.floatValue == 0.5) { return; } /// 修改模型数据 _ex_buynum_texField.text = [NSString stringWithFormat:@"%.1f",_ex_buynum_texField.text.floatValue - 0.5]; _goodsModel.goods_number = _ex_buynum_texField.text.floatValue; if ([self.shopDelegate respondsToSelector:@selector(shopCellEndEditerClick:beforeBuyNum:)]) { [self.shopDelegate shopCellEndEditerClick:self.tag beforeBuyNum:beforeBuyNum]; } /// 传递给服务器 一会写 $$$$$$$$}

@end

// 传递模型数据- shopCarClick { MKShopCarController * shop = [MKShopCarController new]; shop.modelList = _nmArray; [self.navigationController pushViewController:shop animated:YES];}

老葡京娱乐平台 6

#pragma mark - cell上的代理方法获 | 取的价格- shopCellSelectedClick:(NSInteger)shopCellTag { //判断组的是否选中状态是否修改 NSString * cellTagStr = [NSString stringWithFormat:@"%zd",shopCellTag]; NSIndexPath *indexPath = self.dic[cellTagStr]; MKOrderListModel * listModel = (MKOrderListModel*)_modelList[indexPath.section]; //0.便利当前组cell上选中按钮的个数 NSInteger seletedNum =0; for (MKGoodsModel* goodsModel in listModel.goods) { if (goodsModel.isSelected) { seletedNum  = 1; } // 1.当前组的cell的个数 是否等于 勾选的总数 if (((MKOrderListModel*)_modelList[indexPath.section]).goods.count == seletedNum) { listModel.groupSelected = YES; } else { listModel.groupSelected = NO; } [_tableView reloadData]; } MKGoodsModel *goodsModel = ((MKOrderListModel*)_modelList[indexPath.section]).goods[indexPath.row]; float shop_price = goodsModel.shop_price; float goods_number = goodsModel.goods_number; if (!goodsModel.isSelected) { _totalNum = _totalNum - shop_price*goods_number; }else { _totalNum = _totalNum   shop_price*goods_number; } _hejiLabel.text = [NSString stringWithFormat:@"¥%.2f",_totalNum -1   1];}

老葡京娱乐平台 7头视图的代办方法

// cell显示内容- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { MKShopCarCell*shopCell = [tableView dequeueReusableCellWithIdentifier:@"shop"]; shopCell.shopDelegate = self; //取出对应组的对应商品信息 shopCell.goodsModel = ((MKOrderListModel*)_modelList[indexPath.section]).goods[indexPath.row]; // 给cell做标记 shopCell.tag = indexPath.section *100   indexPath.row;// if (_modelList.count != self.dic.count) { NSString * cellTag = [NSString stringWithFormat:@"%zd",shopCell.tag]; NSDictionary* _tempDic = @{ cellTag:indexPath }; [self.dic addEntriesFromDictionary:_tempDic];// } return shopCell;}

全部分界面正是TableView 尾部付钱栏View组成

万一不用系统的话,则利用model来开展单选和全选的操作,选卯月撤回选中对model中的推断字段进展更动,刷新当前cell只怕section。

//一个section刷新

NSIndexSet *indexSet=[[NSIndexSet alloc]initWithIndex:section];

[tableview reloadSections:indexSet

withRowAnimation:UITableViewRowAnimationAutomatic];

//一个cell刷新

NSIndexPath *indexPath=[NSIndexPath indexPathForRow:row inSection:section];

[tableView reloadRowsAtIndexPaths:[NSArray arrayWithObjects:indexPath,nil] withRowAnimation:UITableViewRowAnimationNone];

这里供给注意的是,每趟单选和全选的时候,须求对尾部付钱栏进行多少的刷新,并且单选完整组后,需求对section上的开关实行选中状态变化,当选中section时,相通要求对section下的row实行选中状态,就算一切物品选中,还得供给转移付账栏的动静。(这里其实简单,无非便是对model中各样字段进行校勘,再刷新,同一时候判别选中数量的轻微来进行开关的图景转变)

2.去除单个商品

剔除的话就相对轻便了,直接对数据源删除相应的row,当只剩一个后,删除该数量后,记得删除该组section不然报错。除去后立马刷新底部付钱栏金额显示。

3.编辑section

点击编辑按键,修正model,展现编辑cell。编辑按键上放了数据计数器、商品的音讯、删除。

流量计:用到的是布衣之交的七个库PPNumberButton 钟爱的门阀能够去游玩。点击后用代理方法把数据的变迁跟新model。

商品消息:点击对物品的新闻举办重复选拔,同样改进数据源。

去除:代理出来进行model的修正。

因为此地用的是假数据,所以举行的都是对数据源的矫正,符合规律情状下,原理都一致,能够在次根底上,要是接口成功,就对本地数据实行改正,最终交给的音信会和后台相配三遍的,若是有标题,能够和煦校勘一下。

有同伙提出demo中从不下拉刷新,其实下拉刷新不影响该demo。然则加上效果更加好。

多谢“爱在巴黎梦醒时”该小同伴。

demo的bug注释:

因为demo中判定section的全选和编排的开关都以投身每一个section的首先个row中的,所以删除section的率先个row后,会有全选和编写制定的固定bug出来。特此评释,该bug不影响核心逻辑,如次bug影响小同伴对逻辑思路的上学,那自身前面再重复组织数据源。

1.在刷新尾部付账栏的总金额时,同一时间跟新全选状态。(及尾巴部分买单栏的UI都要联合刷新叁遍)

#pragma mark - 代理方法组头header的选中状态- headerSelectedBtnClick:(NSInteger)section { // NSLog(@"%zd",section); MKOrderListModel*listModel = _modelList[section]; listModel.groupSelected = !listModel.groupSelected; // 判断如果点击 | header选中 if (listModel.groupSelected) { for (MKGoodsModel* goodsModel in listModel.goods) { if (!goodsModel.isSelected) { //下面不是选中状态的cell 将价格加入到总价当中 float shop_price = goodsModel.shop_price; //价格 float goods_number = goodsModel.goods_number; // 数量 _totalNum  = shop_price * goods_number; goodsModel.isSelected = YES; } } } else { // 取消header选中 所有都取消 for (MKGoodsModel* goodsModel in listModel.goods) { goodsModel.isSelected = NO; float shop_price = goodsModel.shop_price; //价格 float goods_number = goodsModel.goods_number; // 数量 _totalNum -= shop_price * goods_number; } }// NSLog(@"总价格为: %.2f",_totalNum); _hejiLabel.text = [NSString stringWithFormat:@"¥%.2f",_totalNum - 1   1]; [_tableView reloadData];}

始建二种cell,三个是常规的物料显得cell,另三个cell是编写后的cell。

注意点 : ①或许碰着删除报错的图景,须求标准化到二个有的时候的可变数组中做去除操作 再把删除后的数组回传②判别删除cell中的选中,假使当选状态则在总的价值中减去此价位就能够③去除操作这里须要追加接口后台数据做去除

老葡京娱乐平台 8编写商品音信

#import "ViewController.h"#import "MKShopCarController.h"#import "MKOrderListModel.h"#import "MJExtension.h"

//中划线

NSDictionary *attribtDic = @{NSStrikethroughStyleAttributeName: [NSNumber numberWithInteger:NSUnderlineStyleSingle]};

NSMutableAttributedString *attribtStr = [[NSMutableAttributedString alloc]initWithString:info[@"GoodsOldPrice"] attributes:attribtDic];

// 赋值

_Goods_OldPrice.attributedText = attribtStr;

纯手打,如果有用希望多多支持!~

cell的创导就是和我们常常的千人一面,把要显得的样式代码编写大概xib都得以。再把数据源填充到大家所创设好的cell花月段头上。

逻辑分析: 组头点击选中 : 则遍历本组cell 未当选状态的cell计算价格走入到总价值更并改cell选中状态组头点击未选中 : 遍历本组中cell 的价位 从总共价值中减去并修正cell的入选状态最终reloadData

以杂货店为section:商铺下的货色为row和合营社名称组成三个 section

本文由新浦京81707con发布于首页,转载请注明出处:老葡京娱乐平台购物车的逻辑及处理,两个代理

关键词: 新浦京81707con 购物车 完整版 两个 精简版

上一篇:奥门新萄京83855com:Jianwoo中的设计模式,iOS购物

下一篇:没有了