V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
爱意满满的作品展示区。
Jarvi
V2EX  ›  分享创造

一个逻辑清晰的购物车模型

  •  
  •   Jarvi ·
    lll1024 · 2017-03-28 16:01:17 +08:00 · 2313 次点击
    这是一个创建于 2578 天前的主题,其中的信息可能已经有所发展或是发生改变。

    GitHub: https://github.com/lll1024/JVShopcart

    效果图

    2017-03-25 18.28.23.gif

    说明

    这是一个具备常规功能并方便改造的购物车模型 一共包含五个模块:

    • JVShopcartViewController: 购物车控制器 负责协调 Model 和 View 只有 100 多行代码
    • JVShopcartFormat: 负责网络请求与逻辑处理
    • JVShopcartTableViewProxy: 作为控制器里边 TableView 的代理
    • View: 包括 Cell 、 HeaderView 、 CountView(改变商品数的视图)、 BottomView(控制器底部包含结算按钮的视图)
    • Model: 包含 BrandModel 和 ProductModel 两层

    使用

    首先将工程里边的 JVShopcart 文件夹拖入你的项目 然后就是开源库 Vendor 文件夹根据需求处理 Model 是一定会改的 但是购物车的 Model 大同小异 其他的改动不会太大

    关于JVShopcartViewController,由于其遵循 JVShopcartFormatDelegate 协议,而协议里边的方法都是用@required修饰的,所以必须要实现它;下面依次介绍这些方法:

    - (void)shopcartFormatRequestProductListDidSuccessWithArray:(NSMutableArray *)dataArray;
    - (void)shopcartFormatAccountForTotalPrice:(float)totalPrice
                                    totalCount:(NSInteger)totalCount
                                 isAllSelected:(BOOL)isAllSelected;
    - (void)shopcartFormatSettleForSelectedProducts:(NSArray *)selectedProducts;
    - (void)shopcartFormatHasDeleteAllProducts;
    
    • 这是请求购物车列表成功之后的回调方法,将装有 Model 的数组回调到控制器;控制器将其赋给 TableView 的代理类JVShopcartTableViewProxy并刷新 TableView 。
    • 这是用户在操作了单选、多选、全选、删除这些会改变底部结算视图里边的全选按钮状态、商品总价和商品数的统一回调方法,这条 API 会将用户操作之后的结果,也就是是否全选、商品总价和和商品总数回调给JVShopcartViewController, 控制器拿着这些数据调用底部结算视图 BottomView 的 configure 方法并刷新 TableView ,就完成了 UI 更新。
    • 这是用户点击结算按钮的回调方法,这条 API 会将剔除了未选中 ProductModel 的模型数组回调给JVShopcartViewController,但并不改变原数据源因为用户随时可能返回。
    • 这是用户删除了购物车所有数据之后的回调方法,你可能会做些视图的隐藏或者提示。

    关于JVShopcartFormat,这个类主要负责网络请求与逻辑处理以及结果的回调。下面依次介绍这些方法:

    - (void)requestShopcartProductList;
    - (void)selectProductAtIndexPath:(NSIndexPath *)indexPath isSelected:(BOOL)isSelected;
    - (void)selectBrandAtSection:(NSInteger)section isSelected:(BOOL)isSelected;
    - (void)changeCountAtIndexPath:(NSIndexPath *)indexPath count:(NSInteger)count;
    - (void)deleteProductAtIndexPath:(NSIndexPath *)indexPath;
    - (void)starProductAtIndexPath:(NSIndexPath *)indexPath;
    - (void)selectAllProductWithStatus:(BOOL)isSelected;
    - (void)settleSelectedProducts;
    
    • 这是请求购物车数据源的方法,大家一般都是对 AFNetworking 进行二次封装来请求数据。
    • 这是用户选中了某个产品或某个 row 的处理方法,因为这会改变底部结算视图所以一定会回调上文协议中的第二个方法, 下同。
    • 这是用户选中了某个品牌或某个 section 的处理方法
    • 这是用户改变了商品数量的处理方法
    • 这是用户删除操作的处理方法
    • 这是用户收藏操作的处理方法,这里没有回调任何方法,也可以根据需求添加回调方法。
    • 这是用户结算操作的处理方法

    有几个点需要注意:

    • BrandModel 里边有两个成员变量是手动添加进去的: isSelected 和 selectedArray 前者是为了记录某个品牌或者说某个 section 是否被选中 后者是结算的时候记录选中的商品
    • ProductModel 里边的 isSelected 也是手动添加的 也是为了记录某个商品或者说某个 row 是否被选中
    • Vendor 文件夹里边是一些开源库 布局依赖 Masonry 字典转模型依赖 MJExtension 图片异步加载依赖 SDWebImage 键盘的管理依赖 IQKeyboardManager 当然你也可以自己处理
    • View 里边的回调都是用的 Block JVShopcartFormat 里边的回调都是用的 delegate 你也可以根据需求自行选择具体的回调方式
    • 虽然购物车大同小异 但是总有些奇葩的需求需要自己去处理 肯定是要根据我的注释去做一些修改的

    以上如有帮助欢迎 star

    第 1 条附言  ·  2017-03-28 16:57:29 +08:00
    关于 JVShopcartFormat , 漏了倒数第二条 API 的说明,那是用户点击全选按钮时的处理方法
    gen900
        1
    gen900  
       2017-03-28 17:47:38 +08:00
    这个组件好,要早几年发布我也不用这么辛苦做购物车了,确实很花功夫。
    gen900
        2
    gen900  
       2017-03-28 17:50:20 +08:00
    如果能支持 最小/最大 购买数量就更好了。或者增加个属相修改的 delegate ,(bool) qualityChanging, didQualityChanged
    Jarvi
        3
    Jarvi  
    OP
       2017-03-28 18:02:03 +08:00
    @gen900 最大购买量是依赖库存的( ProductModel 里边 productStock 参数) 当“+”变灰色就表示不可点状态也就无法添加了 最小购买量当然是 1 了 商品数量的改变是 JVShopcartFormat 的- (void)changeCountAtIndexPath:(NSIndexPath *)indexPath count:(NSInteger)count 负责处理 处理完之后会统一回调这个方法
    - (void)shopcartFormatAccountForTotalPrice:(float)totalPrice
    totalCount:(NSInteger)totalCount
    isAllSelected:(BOOL)isAllSelected;
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   5687 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 02:25 · PVG 10:25 · LAX 19:25 · JFK 22:25
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.