忙里偷闲,把之前写好的商城购物车整理下给大家分享。现在上面有很多的购物车,个人感觉写的不是很完整,这里补充了一些。先上图,说下简单的逻辑
购物车的逻辑基本主要是在选中对应产品,根据产品数量和选中的产品去更改对应价格。这个思路理清了就很简单了。在这个基础上我的demo仿照京东做了个编辑。编辑模式下商品的选择是跟非编辑模式是不干扰的。下面上代码
NSString*pathStr = [[NSBundle mainBundle] pathForResource:@"YSDota" ofType:nil];
NSData* data = [NSData dataWithContentsOfFile:pathStr];
NSDictionary *json = [NSJSONSerialization JSONObjectWithData:data options:0 error:nil];
NSArray * array = json[@"group_goods_cart"];
for (NSDictionary* list in array) {
MKOrderListModel* obj = [MKOrderListModel mj_objectWithKeyValues:list];
[self.dateArray addObject:obj];
}
先获取数据,上面代码是本地的数据。同学们接入的时候替换成自己的就行了
//判断组的是否选中状态是否修改
NSString * cellTagStr = [NSString stringWithFormat:@"%zd",shopCellTag];
NSIndexPath *indexPath = self.dic[cellTagStr];
MKOrderListModel * listModel = (MKOrderListModel*)self.dateArray[indexPath.section];
//0.便利当前组cell上选中按钮的个数
NSInteger seletedNum =0;
for (MKGoodsModel* goodsModel in listModel.goods) {
if (goodsModel.isSelected) {
seletedNum += 1;
}
// 1.当前组的cell的个数 是否等于 勾选的总数
if (((MKOrderListModel*)self.dateArray[indexPath.section]).goods.count == seletedNum) {
listModel.groupSelected = YES; //cell改变组头变为选中
//判断 //cell改变组头 //组头改变全选
NSInteger selectedNum = 0 ;
for (MKOrderListModel * tempListModel in self.dateArray) {//遍历所有组
if (tempListModel.groupSelected) {//如果组头是选中的
selectedNum += 1;
}
if (selectedNum == self.dateArray.count) {
[_footView setDotType:YES];
}
}
} else {
listModel.groupSelected = NO;
[_footView setDotType:NO];
}
[_shopTable reloadData];
}
// 计算价格
MKGoodsModel *goodsModel = ((MKOrderListModel*)self.dateArray[indexPath.section]).goods[indexPath.row];
float goods_price = goodsModel.goods_price;
float goods_number = goodsModel.goods_number;
if (!goodsModel.isSelected) {
_totalNum -= goods_price*goods_number;
}else {
_totalNum+= goods_price*goods_number;
}
[_footView setSettlementPrice:[NSString stringWithFormat:@"¥%.2f",_totalNum -1 + 1]];
这里是主要的逻辑,主要是通过判断区的选中的状态或者个别商品的选中状态去改变对于商品的价格。这里就不详细说了 ,同学们自己看demo,文章末尾上链接。(有疑问或者发现有误的可以相互交流)
最后面就是编辑状态:
在进入编辑状态的时候取出对应商店里选中的商品(注意:demo中的商品是通过商品的ID作为key,一定要唯一值不然可能或出现商品错乱)存放是以字典形式存放在数组中、当用户点击完成后返回非编辑模式,在通过数组遍历,根据字典里面的key判断商品是否被选中,选中的改变商品选中状态。
sender.selected = !sender.selected;
if (sender.selected) { // 进入编辑状态 记录原数据 清空选中状态
[_rightEditor setTitle:@"完成" forState:(UIControlStateNormal)];
[self.rowArray removeAllObjects];
// 点击编辑清除所有状态
[self changShopGoodblack:^(NSInteger section, NSInteger row) {
MKGoodsModel *goodsModel = ((MKOrderListModel*)self.dateArray[section]).goods[row];
if (goodsModel.isSelected) { // 记录选中的商品 (选唯一值作为判断 一般商品id都是唯一的)
if (![self.rowArray containsObject:goodsModel.goods_id]) {
[self.rowArray addObject:[NSString stringWithFormat:@"%ld-%@",(long)section,goodsModel.goods_id]];
}
}
goodsModel.isSelected = NO;
[self shopCellSelectedClicksection:section row:row];
}];
// 隐藏价格刷新数据
[_footView sethiddenViewWithPrice:YES settle:@"删除"];
[_footView sethiddenViewWithCollectionButton:NO];
[_shopTable reloadData];
}else {
// 清除价格重新计算
_totalNum = 0;
[_rightEditor setTitle:@"编辑" forState:(UIControlStateNormal)];
// 重新计算商品之前先清除所有收藏的选中状态
[self changShopGoodblack:^(NSInteger section, NSInteger row) {
MKGoodsModel *goodsModel = ((MKOrderListModel*)self.dateArray[section]).goods[row];
goodsModel.isSelected = NO;
}];
// 回复购物车原来选中的商品
[self changShopGoodblack:^(NSInteger section, NSInteger row) {
MKGoodsModel *goodsModel = ((MKOrderListModel*)self.dateArray[section]).goods[row];
for (NSString *selectGood in self.rowArray)
{
NSArray *good_p = [selectGood componentsSeparatedByString:@"-"];
// 判断对应的分区
if ([good_p[0]integerValue] == section)
{
// 判断对应分区的商品id(商品在编辑状态时可能已被删除)
if ([good_p[1] isEqualToString:goodsModel.goods_id])
{
goodsModel.isSelected = YES;
}
}
}
[self shopCellSelectedClicksection:section row:row];
}];
[_footView sethiddenViewWithPrice:NO settle:@"结算"];
[_footView sethiddenViewWithCollectionButton:YES];
[_shopTable reloadData];
}
当然如果你有好的方式也可以跟大家分享下。
根据我对京东APP的观察,他们的商品数据选中状态,数量改变等都是通过服务端存储的,前端只需要传值然后更新对应的cell就行了。demo里面选中状态那样写是因为我们这边的服务端不愿去做这些繁杂的东西。所以写得并不是很完整,大家可根据自己需求去小改下。
最后--------------------https://gitee.com/xpyt/goodscart/tree/master