• Stars
    star
    268
  • Rank 153,144 (Top 4 %)
  • Language
    Objective-C
  • License
    MIT License
  • Created almost 9 years ago
  • Updated over 2 years ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

比较完整的购物车界面及逻辑,商品展示,多选,单选,全选及滑动删除,价格计算;

LDCartViewController

重新整理了之前的购物车逻辑,删除了部分代码,修改了部分方法,逻辑结构更清晰,复用更容易 #####此demo的swift版本:CartDemo_Swift

本demo完整展示了购物车的处理逻辑, 及实现思路, 具体的业务处理, 还需要根据自己的需求来定制

购物车功能

  • 商品展示
  • 商品选择
  • 价格计算
  • 商品删除

说明

本次更新,重新整理了代码,整体结构更清晰,方便在此基础上进行个人需求的定制

  • 整体布局脱离了对Masnary的依赖 如果需要使用Masnary,可重新设置控件坐标
  • 重写了自定义cell的对外方法 减少了不必要的属性暴漏在.h文件,尽量使用方法来调用相关设置,使用更方便,逻辑更清晰
@interface LZCartTableViewCell : UITableViewCell
//商品数量
@property (assign,nonatomic)NSInteger lzNumber;
@property (assign,nonatomic)BOOL lzSelected;

- (void)reloadDataWithModel:(LZCartModel*)model;
- (void)numberAddWithBlock:(LZNumberChangedBlock)block;
- (void)numberCutWithBlock:(LZNumberChangedBlock)block;
- (void)cellSelectedWithBlock:(LZCellSelectedBlock)block;
@end

对这里的两个属性,需要简单的说明一下:

  • lzNumber :主要是提供给外部修改显示的商品数量,商品数量的变动,这次我放在cell内;一般情况下,外部需要和服务器交互,只有商品数量真正(服务器内记录的数据)发生变化了,才能去修改显示的数目,在上面的第二个和第三个方法的block内修改cell的这个属性即可,记得也要修改相应的数据模型;
  • lzSelected :主要是提供给外部修改该商品的选中状态,这次我将这个显示状态的变动放在了cell外部进行操作,同样是考虑到,外部要和服务器进行交互,只有商品真正(服务器记录的数据)添加到订单内,才能改变显示状态,同样在上面的第四个方法的block内修改这个属性即可,同样也要修改相应的数据模型;

PS:如果这两个量的变化不需要和服务器交互,直接在本地完成的,其显示状态可以直接在cell内部相应的点击方法里修改即可,外部只需修改相应的数据模型;


代码中,我设置了3个BOOL值:

BOOL _isHiddenNavigationBarWhenDisappear;//记录当页面消失时是否需要隐藏系统导航
BOOL _isHasTabBarController;//是否含有tabbar
BOOL _isHasNavitationController;//是否含有导航

作用后面都有注释,其中的第一个BOOL值需要简单说明一下: 因为我在控制器的viewWillAppearviewWillDisappear方法里做了一些判断,前者判断了当前控制器是否是属于导航,当是属于导航时,需要隐藏系统的导航条,因为有可能不会使用导航,所以我在这里自定义了导航条;后者在退出此视图时,需要把隐藏掉的导航再显示出来,但是这有个前提:使用了系统的导航,没有自定义,鉴于很多情况下都是使用自定义的导航,这时如果显示了系统导航,反而会弄巧成拙,所以第一BOOL值就是用来记录是否使用了系统导航的;

- (void)viewWillAppear:(BOOL)animated {
    
    if (_isHasNavitationController == YES) {
        if (self.navigationController.navigationBarHidden == YES) {
            _isHiddenNavigationBarWhenDisappear = NO;
        } else {
            self.navigationController.navigationBarHidden = YES;
            _isHiddenNavigationBarWhenDisappear = YES;
        }
    }
  }
- (void)viewWillDisappear:(BOOL)animated {
    if (_isHiddenNavigationBarWhenDisappear == YES) {
        self.navigationController.navigationBarHidden = NO;
    }
}
价格计算

价格的计算,这里我是直接遍历已选择的数组,取出其中的Model来计算的:

/**
 *  @author LQQ, 16-02-18 11:02:16
 *
 *  计算已选中商品金额
 */
-(void)countPrice {
    double totlePrice = 0.0;
    
    for (LZCartModel *model in self.selectedArray) {
        
        double price = [model.price doubleValue];
        
        totlePrice += price*model.number;
    }
    self.totlePriceLabel.text = [NSString stringWithFormat:@"%.2f",totlePrice];
}

使用

使用的时候直接将demo中的LZCartViewController文件夹下的文件拖进工程即可,注意不能直接使用,要根据自己的需求修改;

关于控制器LZCartViewController

建议直接使用我这个控制器LZCartViewController,里面我根据功能划分了几个区域,界面的东西修改为自己需要的,逻辑部分可以不用做太大的修改,添加上与服务器的交互及验证逻辑即可;

关于数据模型LZCartModel

数据模型这里肯定是要根据自己的需求进行定制的,这里我创建的模型是这样的:

@interface LZCartModel : NSObject
//自定义模型时,这三个属性必须有
@property (nonatomic,assign) BOOL select;
@property (nonatomic,assign) NSInteger number;
@property (nonatomic,copy) NSString *price;
//下面的属性可根据自己的需求修改
@property (nonatomic,copy) NSString *sizeStr;
@property (nonatomic,copy) NSString *nameStr;
@property (nonatomic,copy) NSString *dateStr;
@property (nonatomic,retain)UIImage *image;

@end

需要注意的是,demo中的模型前三个属性,是必须要有的,一般购物车也都有这些属性,如果不想改动太多,建议使用和我一样的命名

  • select:用来记录当前数据是否被选中;
  • number和price:用来计算总价;
关于自定义单元格LZCartTableViewCell

建议直接修改界面布局为自己项目的设计,里面大部分的逻辑是不需要动的,除非你把网络请求的一些东西放到cell中来了; .h文件内的属性和方法,建议不要修改,可以直接使用;

关于ConfigFile文件夹

里面有三个文件,一个是UIView的扩展类目;一个是头文件,保存一些公共的宏定义和全局变量;

效果图

效果图 增加分组效果图

总结

购物车的逻辑其实并不复杂,重构这个demo也花了不少时间,希望对你能有所帮助,使用过程中如果有bug,或者功能上错误,或者一些新功能,或者其他的建议,请可以联系我302934443;

如果对你有帮助,欢迎右上角star或者fork

本人CSDN博客,欢迎访问,一同学习!!!!
简书地址,目前文章还不多,慢慢的会发一些学习总结,欢迎关注!

More Repositories

1

LQAccount

密码保护小工具, 完整小项目
Objective-C
164
star
2

LQThirdParty

第三方的一些demo: 微信支付/支付宝支付/友盟登录分享/ShareSDK登录分享/原生微信QQ微博登录分享。sign in with apple 苹果账号登录
Objective-C
116
star
3

LQRelayoutButton

调整UIButton的title和image位置
Objective-C
53
star
4

LSearchController

搜索框简单使用
Objective-C
35
star
5

LQButtonCategory

修改UIButton标题和图片位置的扩展
Objective-C
33
star
6

LQPickerView

全国城市地区选择器
Objective-C
30
star
7

LQListMoreView

tableView+collectionView,展开显示更多信息
Objective-C
23
star
8

LQFoldButton

自定义点击展开列表view
Objective-C
22
star
9

LQInterfaceRotation

Objective-C
15
star
10

LQSegmentViewController

使用UIPageViewController实现的选项卡控制器
Objective-C
13
star
11

LQiCloudDemo

iCloud云存储demo
Objective-C
12
star
12

CartDemo_Swift

购物车(swift版)
Swift
11
star
13

LQQPageControllerDemo

以翻书形式实现展示图片,具体介绍demo中有注释,也可参考博客
Objective-C
10
star
14

LQ4DirectionsScrollView

UITableView + UICollectionView 实现的二维滑动选择器
Swift
7
star
15

LQSortTool

分组排序工具
Objective-C
6
star
16

LDBookViewController

使用 Swift3.0 实现的翻书效果控制器--UIPageViewController的使用
Swift
5
star
17

SwiftLearnNote

Swift3.0的学习笔记
Swift
4
star
18

blogDemo-1

使用swift闭包实现oc中block回调模式
Swift
4
star
19

LQHEICToJPG

HEIC 与 JPG/PNG 相互转换
Swift
4
star
20

LQPhotoPicker

Swift相册多选/视频选择/拍照/
Swift
3
star
21

LQRecordButton

长按带进度条的按钮, 含单击事件
Objective-C
3
star
22

LQDocument

UIDocument的简单使用
Objective-C
3
star
23

UIViewCornerDemo

基于UIView扩展的类目,设置上下左右某一边的圆角
Objective-C
3
star
24

LQSortTool-Swift

Swift4.0 版本的分组排序工具, 可对字符串和实例对象进行排序
Swift
3
star
25

LQTransitAnimation

仿AppStore首页转场动画,自定义Present/dismiss与push/pop动画
Objective-C
3
star
26

LQTabBarController

LZTabBarController自定义
Objective-C
3
star
27

LQQNameSortTool

简单的对汉字姓名进行按首字母分组排序的工具
Objective-C
3
star
28

LQPressButton

Swift3.写的一个自定义button, 长按出现进度条, 计时; 含单击事件
Swift
3
star
29

SafetyArrayDemo

防止数组越界和添加的值为nil引起的crash;有替换系统方法和自定义方法两种方式
Objective-C
3
star
30

LQZoomView

对UIScrollView进行封装的图片缩放查看视图, 含双击/单击手势; 缩放过程中视图居中显示
Swift
2
star
31

LQPopView

可自定义界面的弹出视图(含动画效果)
Objective-C
2
star
32

LQTouchID

对touchID的简单封装--Swift 3.0
Swift
2
star
33

LDGesture-swift

手势解锁Swift3.0
Swift
2
star
34

LQWebView

封装了 WKWebView 常用的方法,使用方便
Objective-C
2
star
35

FMDB-Swift

使用Swift对FMDB进行简单的封装
Objective-C
2
star
36

LDPasswordViewController

仿手机系统设置数字密码界面
Objective-C
2
star
37

LQAlamoUnit

基于Alamofire/SwiftyJSON的网络请求封装
Swift
2
star
38

LQScanView

二维码扫描,识别图片中二维码,长按识别图标二维码, 支持横竖屏
Objective-C
2
star
39

LQLogisticsView

物流轨迹
Objective-C
1
star
40

LQDelegateTest

代理协议传值demo
Objective-C
1
star
41

LDInputView

六位数字密码输入框
Swift
1
star