iOS---购物车

前言

由于前段时间现在项目中用到了购物车,花了点时间写了写,但是新版本居然砍掉了,于是又抽出来,写了个小demo,主要是逻辑的实现,基本应付大部分购物车需求,当然也可以完善一下,加上自己的需求!

个人感觉主要的逻辑就是选中问题,单个商品的选中,整个分区的选择,全选以及价格的计算。

界面有点丑了,没有图片,设置的随机色,主要看逻辑把!

下面贴部分代码----Controller中部分代码

1. UI部分

#pragma  mark --------------------- UI ------------------

- (void)setSubViews {

CGFloat tabBarHeight = kTabBarHeight;

if(self.isSubPage) {

tabBarHeight = kTabBarHeight-49;

}else{

tabBarHeight = kTabBarHeight;

}

self.myTableView = [[UITableView alloc] initWithFrame:CGRectMake(0, kNavBarHeight, kScreenWidth, kScreenHeight-kNavBarHeight-tabBarHeight - kBottomHeight) style:(UITableViewStyleGrouped)];

self.myTableView.dataSource = self;

self.myTableView.delegate = self;

[self.view addSubview:self.myTableView];

self.myTableView.tableFooterView = [[UIView alloc] init];

[self.myTableView registerNib:[UINib nibWithNibName:@"HBK_ShoppingCartCell"bundle:nil] forCellReuseIdentifier:@"HBK_ShoppingCartCell"];

[self.myTableView registerNib:[UINib nibWithNibName:@"HBK_ShoppingCartHeaderView"bundle:nil] forHeaderFooterViewReuseIdentifier:@"HBK_ShoppingCartHeaderView"];

self.bottomView = [[[NSBundle mainBundle] loadNibNamed:@"HBK_ShopppingCartBottomView"owner:nil options:nil] objectAtIndex:0];

self.bottomView.frame = CGRectMake(0, kScreenHeight - tabBarHeight - kBottomHeight, kScreenWidth, kBottomHeight);

//全选

[self clickAllSelectBottomView:self.bottomView];

[self.view addSubview:self.bottomView];

}

#pragma mark ------------------  ----

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {

returnself.storeArray.count;

}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {

HBK_StoreModel *storeModel = self.storeArray[section];

returnstoreModel.goodsArray.count;

}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

HBK_ShoppingCartCell *cell = [tableView dequeueReusableCellWithIdentifier:@"HBK_ShoppingCartCell"];

HBK_StoreModel *storeModel = self.storeArray[indexPath.section];

HBK_GoodsModel *goodsModel = storeModel.goodsArray[indexPath.row];

cell.goodsModel = goodsModel;

//把事件的处理分离出去

[self shoppingCartCellClickAction:cell storeModel:storeModel goodsModel:goodsModel indexPath:indexPath];

returncell;

}

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {

returnkFit(100);

}

- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section {

returnkFit(40);

}

- (CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section {

returnCGFLOAT_MIN;

}

- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section {

HBK_ShoppingCartHeaderView *headerView = [tableView dequeueReusableHeaderFooterViewWithIdentifier:@"HBK_ShoppingCartHeaderView"];

headerView.contentView.backgroundColor = [UIColor whiteColor];

HBK_StoreModel *storeModel = self.storeArray[section];

headerView.storeModel = storeModel;

//分区区头点击事件--- 把事件分离出去

[self clickSectionHeaderView:headerView andHBK_StoreModel:storeModel];

returnheaderView;

}

- (NSString *)tableView:(UITableView *)tableView titleForDeleteConfirmationButtonForRowAtIndexPath:(NSIndexPath *)indexPath {

return@"删除";

}

- (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath {

returnYES;

}

- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath {

if(editingStyle == UITableViewCellEditingStyleDelete) {

UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"确定删除?"message:nil preferredStyle:(UIAlertControllerStyleAlert)];

kWeakSelf(self);

[alert addAction:[UIAlertAction actionWithTitle:@"是"style:(UIAlertActionStyleDefault) handler:^(UIAlertAction * _Nonnull action) {

kStrongSelf(self);

[self deleteGoodsWithIndexPath:indexPath];

}]];

[alert addAction:[UIAlertAction actionWithTitle:@"否"style:(UIAlertActionStyleDefault) handler:nil]];

[self presentViewController:alert animated:YES completion:nil];

}

}

2. Action逻辑处理

#pragma mark ------------------------Action 逻辑处理-----------------------------

/**

判断分区有没有被全选

@param section 分区坐标

*/

- (void)judgeIsSelectSection:(NSInteger)section {

HBK_StoreModel *storeModel = self.storeArray[section];

BOOL isSelectSection = YES;

//遍历分区商品, 如果有商品的没有被选择, 跳出循环, 说明没有全选

for(HBK_GoodsModel *goodsModelinstoreModel.goodsArray) {

if(goodsModel.isSelect == NO) {

isSelectSection = NO;

break;

}

}

//全选了以后, 改变一下选中状态

HBK_ShoppingCartHeaderView *headerView = (HBK_ShoppingCartHeaderView *)[self.myTableView headerViewForSection:section];

headerView.isClick = isSelectSection;

storeModel.isSelect = isSelectSection;

}

/**

是否全选

*/

- (void)judgeIsAllSelect {

NSInteger count =0;

//先遍历购物车商品, 得到购物车有多少商品

for(HBK_StoreModel *storeModelinself.storeArray) {

count += storeModel.goodsArray.count;

}

//如果购物车总商品数量 等于 选中的商品数量, 即表示全选了

if(count == self.selectArray.count) {

self.bottomView.isClick = YES;

}else{

self.bottomView.isClick = NO;

}

}

/**

计算价格

*/

- (void)countPrice {

double totlePrice =0.0;

for(HBK_GoodsModel *goodsModelinself.selectArray) {

double price = [goodsModel.realPrice doubleValue];

totlePrice += price * [goodsModel.count integerValue];

}

self.bottomView.allPriceLabel.text = [NSString stringWithFormat:@"合计 ¥%.2f", totlePrice];

}

3、Action点击事件的处理

#pragma mark  ----------- Action 点击事件 --------------------

/**

区头点击----选中某个分区/取消选中某个分区

@param headerView 分区

@param storeModel 分区模型

*/

- (void)clickSectionHeaderView:(HBK_ShoppingCartHeaderView *)headerView andHBK_StoreModel:(HBK_StoreModel *)storeModel {

headerView.ClickBlock = ^(BOOL isClick) {

storeModel.isSelect = isClick;

if(isClick) {//选中

NSLog(@"选中");

for(HBK_GoodsModel *goodsModelinstoreModel.goodsArray) {

goodsModel.isSelect = YES;

if(![self.selectArray containsObject:goodsModel]) {

[self.selectArray addObject:goodsModel];

}

}

}else{//取消选中

NSLog(@"取消选中");

for(HBK_GoodsModel *goodsModelinstoreModel.goodsArray) {

goodsModel.isSelect = NO;

if([self.selectArray containsObject:goodsModel]) {

[self.selectArray removeObject:goodsModel];

}

}

}

[self judgeIsAllSelect];

[self.myTableView reloadData];

[self countPrice];

};

}

/**

全选点击---逻辑处理

@param bottomView 底部的View

*/

- (void)clickAllSelectBottomView:(HBK_ShopppingCartBottomView *)bottomView {

kWeakSelf(self);

bottomView.AllClickBlock = ^(BOOL isClick) {

kStrongSelf(self);

for(HBK_GoodsModel *goodsModelinself.selectArray) {

goodsModel.isSelect = NO;

}

[self.selectArray removeAllObjects];

if(isClick) {//选中

NSLog(@"全选");

for(HBK_StoreModel *storeModelinself.storeArray) {

storeModel.isSelect = YES;

for(HBK_GoodsModel *goodsModelinstoreModel.goodsArray) {

goodsModel.isSelect = YES;

[self.selectArray addObject:goodsModel];

}

}

}else{//取消选中

NSLog(@"取消全选");

for(HBK_StoreModel *storeModelinself.storeArray) {

storeModel.isSelect = NO;

}

}

[self.myTableView reloadData];

[self countPrice];

};

bottomView.AccountBlock = ^{

NSLog(@"去结算");

};

}

- (void)shoppingCartCellClickAction:(HBK_ShoppingCartCell *)cell

storeModel:(HBK_StoreModel *)storeModel

goodsModel:(HBK_GoodsModel *)goodsModel

indexPath:(NSIndexPath *)indexPath {

//选中某一行

cell.ClickRowBlock = ^(BOOL isClick) {

goodsModel.isSelect = isClick;

if(isClick) {//选中

NSLog(@"选中");

[self.selectArray addObject:goodsModel];

}else{//取消选中

NSLog(@"取消选中");

[self.selectArray removeObject:goodsModel];

}

[self judgeIsSelectSection:indexPath.section];

[self judgeIsAllSelect];

[self countPrice];

};

//加

cell.AddBlock = ^(UILabel *countLabel) {

NSLog(@"%@", countLabel.text);

goodsModel.count = countLabel.text;

[self.selectArray replaceObjectAtIndex:indexPath.row withObject:goodsModel];

[self countPrice];

};

//减

cell.CutBlock = ^(UILabel *countLabel) {

NSLog(@"%@", countLabel.text);

goodsModel.count = countLabel.text;

​[self.selectArray replaceObjectAtIndex:indexPath.row withObject:goodsModel];

[self countPrice];

};

}

/**

删除某个商品

@param indexPath 坐标

*/

- (void)deleteGoodsWithIndexPath:(NSIndexPath *)indexPath {

HBK_StoreModel *storeModel = [self.storeArray objectAtIndex:indexPath.section];

HBK_GoodsModel *goodsModel = [storeModel.goodsArray objectAtIndex:indexPath.row];

[storeModel.goodsArray removeObjectAtIndex:indexPath.row];

[self.myTableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:(UITableViewRowAnimationFade)];

if(storeModel.goodsArray.count ==0) {

[self.storeArray removeObjectAtIndex:indexPath.section];

}

if([self.selectArray containsObject:goodsModel]) {

[self.selectArray removeObject:goodsModel];

[self countPrice];

}

NSInteger count =0;

for(HBK_StoreModel *storeModelinself.storeArray) {

count += storeModel.goodsArray.count;

}

if(self.selectArray.count == count) {

_bottomView.clickBtn.selected = YES;

}else{

_bottomView.clickBtn.selected = NO;

}

if(count ==0) {

//此处加载购物车为空的视图

}

dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.5* NSEC_PER_SEC)), dispatch_get_main_queue(), ^{

[self.myTableView reloadData];

});

}

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,539评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,911评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,337评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,723评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,795评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,762评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,742评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,508评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,954评论 1 308
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,247评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,404评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,104评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,736评论 3 324
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,352评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,557评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,371评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,292评论 2 352

推荐阅读更多精彩内容