zoukankan      html  css  js  c++  java
  • 购物车实现 <Block实现回调>

    效果图如下:

    具体代码实现如下:

    Model:

    #import <Foundation/Foundation.h>
    
    @interface ShopCarModel : NSObject
    
    @property (nonatomic, copy) NSString * goodsName;
    @property (nonatomic, copy) NSString * goodsPrice;
    @property (nonatomic, copy) NSString * goodsImage;
    @property (nonatomic, assign) NSInteger goodsCount;
    @property (nonatomic, assign) BOOL isSelected;
    
    + (instancetype)modelWithDictionary: (NSDictionary *)dictionary;
    
    @end
    #import "ShopCarModel.h"
    
    @implementation ShopCarModel
    
    + (instancetype)modelWithDictionary: (NSDictionary *)dictionary{
        
        ShopCarModel *model = [[ShopCarModel alloc]init];
        [model setValuesForKeysWithDictionary:dictionary];
        return model;
    }
    
    // 容错处理
    - (void)setValue:(id)value forUndefinedKey:(NSString *)key{
        
    }
    @end

    Cell:

    #import <UIKit/UIKit.h>
    @class ShopCarModel;
    
    typedef void(^selectBlock)(NSIndexPath *indexPath); // 选择
    typedef void(^deleteBlock)(NSIndexPath *indexPath); // 删除
    typedef void(^addBlock)(NSIndexPath *indexPath);  // 添加
    typedef void(^subTractBlock)(NSIndexPath *indexPath);  // 相减
    
    @interface ShopCell : UITableViewCell
    
    @property (nonatomic,copy) selectBlock selectedBlock;
    @property (nonatomic,copy) deleteBlock deleteBlock;
    @property (nonatomic,copy) addBlock addBlock;
    @property (nonatomic,copy) subTractBlock subTractBlock;
    @property (nonatomic,strong) ShopCarModel *model;
    @property (nonatomic,strong) NSIndexPath *indexPath;
    
    @end
    #import "ShopCell.h"
    #import "ShopCarModel.h"
    
    @interface ShopCell ()
    
    @property (nonatomic,strong)UIImageView * GoodsImageView;
    @property (nonatomic,strong)UILabel * goodsNameLable;
    @property (nonatomic,strong)UILabel * goodsPriceLable;
    @property (nonatomic,strong)UITextField * goodsCountTextfield;
    @property (nonatomic,strong)UIButton * selectedButton;
    @property (nonatomic,strong)UIButton * deletButton;
    @property (nonatomic,strong)UIButton * subtractButton;
    @property (nonatomic,strong)UIButton * addButton;
    
    @end
    
    @implementation ShopCell
    
    - (instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier{
        
        if (self = [super initWithStyle:style reuseIdentifier:reuseIdentifier]) {
            self.selectionStyle = UITableViewCellSelectionStyleNone;
            [self createSubViews];
        }
        return self;
    }
    
    - (void)createSubViews{
        
        _selectedButton = [UIButton buttonWithType:UIButtonTypeCustom];
        [_selectedButton setImage:[UIImage imageNamed:@"radiobuttons_normal"] forState:UIControlStateNormal];
        [_selectedButton setImage:[UIImage imageNamed:@"radiobuttons_pressed"] forState:UIControlStateSelected];
        //原来选择框框太小经常点不到 就想了这个方法 放大按钮 不放大图片
        [_selectedButton setImageEdgeInsets:UIEdgeInsetsMake(35, 10, 35, 10)];
        _selectedButton.frame = CGRectMake(0, 0, 40, 90);
        _selectedButton.tag = 101;
        [_selectedButton addTarget:self action:@selector(isselectButtonClick:) forControlEvents:UIControlEventTouchUpInside];
        [self.contentView addSubview:_selectedButton];
        
        _GoodsImageView = [[UIImageView alloc]initWithFrame:CGRectMake(_selectedButton.frame.origin.x + 40, 10, 70, 70)];
        _GoodsImageView.layer.cornerRadius = 10;
        [self.contentView addSubview:_GoodsImageView];
        
        _goodsNameLable = [[UILabel alloc]initWithFrame:CGRectMake(_GoodsImageView.frame.origin.x + 80, 10, [UIScreen mainScreen].bounds.size.width - 50 - _GoodsImageView.frame.origin.x - 70 - 10, 30)];
        _goodsNameLable.textAlignment = NSTextAlignmentLeft;
        _goodsNameLable.font = [UIFont systemFontOfSize:14];
        _goodsNameLable.textColor = [UIColor blackColor];
        _goodsNameLable.numberOfLines = 0;
        [self.contentView addSubview:_goodsNameLable];
        
        _goodsPriceLable = [[UILabel alloc]initWithFrame:CGRectMake(_goodsNameLable.frame.origin.x, 55,[UIScreen mainScreen].bounds.size.width - 110 - _GoodsImageView.frame.origin.x - 70 - 10, 30)];
        _goodsPriceLable.textAlignment = NSTextAlignmentLeft;
        _goodsPriceLable.textColor = [UIColor redColor];
        _goodsPriceLable.font = [UIFont systemFontOfSize:13];
        _goodsPriceLable.numberOfLines = 0;
        [self.contentView addSubview:_goodsPriceLable];
        
        _deletButton = [UIButton buttonWithType:UIButtonTypeSystem];
        _deletButton.frame = CGRectMake([UIScreen mainScreen].bounds.size.width - 40, 10, 30, 20);
        [_deletButton setTitle:@"删除" forState:UIControlStateNormal];
        [_deletButton setTitle:@"删除" forState:UIControlStateHighlighted];
        [_deletButton setTitleColor:[UIColor grayColor] forState:UIControlStateNormal];
        _deletButton.titleLabel.font = [UIFont systemFontOfSize:14];
        [_deletButton addTarget:self action:@selector(deletButtonAction:) forControlEvents:UIControlEventTouchUpInside];
        _deletButton.tag = 102;
        [self.contentView addSubview:_deletButton];
        
        _subtractButton = [UIButton buttonWithType:UIButtonTypeSystem];
        [_subtractButton setImage:[UIImage imageNamed:@"carSubtractSelect.png"] forState:UIControlStateNormal];
        [_subtractButton setImage:[UIImage imageNamed:@"carSubtractNamol.png"] forState:UIControlStateSelected];
        [_subtractButton setImage:[UIImage imageNamed:@"carSubtractNamol.png"] forState:UIControlStateHighlighted];
        [_subtractButton setImageEdgeInsets:UIEdgeInsetsMake(15, 10, 15, 5)];
        _subtractButton.frame = CGRectMake([UIScreen mainScreen].bounds.size.width - 110, 40, 35, 50);
        _subtractButton.titleLabel.font = [UIFont systemFontOfSize:14];
        _subtractButton.contentHorizontalAlignment = UIControlContentHorizontalAlignmentCenter;
        [_subtractButton addTarget:self action:@selector(subStractButtonAction:) forControlEvents:UIControlEventTouchUpInside];
        _subtractButton.tag = 105;
        [self.contentView addSubview:_subtractButton];
        
        _goodsCountTextfield = [[UITextField alloc]initWithFrame:CGRectMake(_subtractButton.frame.origin.x + 37, _subtractButton.frame.origin.y + 15, 36, 20)];
        _goodsCountTextfield.borderStyle = 3;
        _goodsCountTextfield.textColor = [UIColor blackColor];
        _goodsCountTextfield.textAlignment = NSTextAlignmentCenter;
        _goodsCountTextfield.font = [UIFont systemFontOfSize:14];
        _goodsCountTextfield.enabled = NO;
        [self.contentView addSubview:_goodsCountTextfield];
        
        _addButton = [UIButton buttonWithType:UIButtonTypeSystem];
        _addButton.frame = CGRectMake(_goodsCountTextfield.frame.origin.x + 36 + 2, _goodsCountTextfield.frame.origin.y - 15, 35, 50);
        [_addButton setImageEdgeInsets:UIEdgeInsetsMake(15, 5, 15, 10)];
        [_addButton setImage:[UIImage imageNamed:@"carAddSelect.png"] forState:UIControlStateNormal];
        [_addButton setImage:[UIImage imageNamed:@"carAddNamol.png"] forState:UIControlStateSelected];
        [_addButton setImage:[UIImage imageNamed:@"carAddNamol.png"] forState:UIControlStateHighlighted];
        _addButton.titleLabel.font = [UIFont systemFontOfSize:14];
        _addButton.contentHorizontalAlignment = UIControlContentHorizontalAlignmentCenter;
        [_addButton addTarget:self action:@selector(addButtonAction:) forControlEvents:UIControlEventTouchUpInside];
        _addButton.tag = 106;
        [self.contentView addSubview:_addButton];
    }
    
    
    - (void)setModel:(ShopCarModel *)model{
        
        _model = model;
        _GoodsImageView.image = [UIImage imageNamed:_model.goodsImage];
        _goodsNameLable.text = [NSString stringWithFormat:@"%@",_model.goodsName];
        _goodsNameLable.text = _model.goodsName;
    
        // 修改label不同颜色显示
        NSString * str = [NSString stringWithFormat:@"价格:¥%@",model.goodsPrice];
        NSMutableAttributedString *attributeStr = [[NSMutableAttributedString alloc]initWithString:str];
        NSRange range = [[attributeStr string]rangeOfString:@"价格:"];
        NSRange reviseRange = NSMakeRange(range.location, range.length);
        [attributeStr addAttribute:NSForegroundColorAttributeName value:[UIColor grayColor] range:reviseRange];
        [_goodsPriceLable setAttributedText:attributeStr];
    
        // 判断最小值
        if (model.goodsCount < 1) {
            _goodsCountTextfield.text = @"1";
        }else{
            _goodsCountTextfield.text = [NSString stringWithFormat:@"%ld",(long)model.goodsCount];
        }
        // 选择的
        if (model.isSelected) {
            _selectedButton.selected = YES;
            [_selectedButton setImage:[UIImage imageNamed:@"radiobuttons_pressed@2x.png"] forState:UIControlStateSelected];
        }
        // 未选的
        else{
            _selectedButton.selected = NO;
            [_selectedButton setImage:[UIImage imageNamed:@"radiobuttons_normal@2x.png"] forState:UIControlStateNormal];
        }
    }
    
    #pragma private method
    
    - (void)isselectButtonClick: (UIButton *)button{
        
        if (self.selectedBlock) {
            self.selectedBlock(self.indexPath);
        }
    }
    
    - (void)deletButtonAction: (UIButton *)button{
        
        if (self.deleteBlock) {
            self.deleteBlock(self.indexPath);
        }
    }
    
    - (void)subStractButtonAction: (UIButton *)button{
        
        if (self.subTractBlock) {
            self.subTractBlock(self.indexPath);
        }
    }
    
    - (void)addButtonAction: (UIButton *)button{
        
        if (self.addBlock) {
            self.addBlock(self.indexPath);
        }
        
    }
    @end

    Controller :

    //
    //  ViewController.m
    //  ShopingCar
    //
    //  Created by 思 彭 on 16/8/17.
    //  Copyright © 2016年 思 彭. All rights reserved.
    //
    
    #import "ViewController.h"
    #import "ZH_Button.h"
    #import "ArrayDataSource.h"
    #import "Masonry.h"
    #import "ShopCarModel.h"
    #import "ShopCell.h"
    #import "DetailViewController.h"
    
    static NSString *const identifier = @"cell";
    #define   ScreenWidth  [UIScreen mainScreen].bounds.size.width
    #define   ScreenHeight  [UIScreen mainScreen].bounds.size.height
    
    @interface ViewController ()<UITableViewDelegate,UITableViewDataSource>
    {
        UIButton * allButton;
        UILabel * moneyLable;
        float priceNumber;
        UIImageView * _backGrundImageView;
        UIButton * balanceButton;
    }
    @property (nonatomic,strong) UITableView *tableView;
    @property (nonatomic,strong) NSMutableArray *dataArray;
    @property (nonatomic,strong) ArrayDataSource *dataSource;
    
    
    @end
    
    @implementation ViewController
    
    - (void)viewDidLoad {
        [super viewDidLoad];
        self.title = @"我的购物车";
        self.view.backgroundColor = [UIColor groupTableViewBackgroundColor];
        [self loadData];
        [self createTabelView];
        [self createBottomView];
    }
    
    #pragma mark - SetUI
    
    - (void)createTabelView{
        
        self.tableView = [[UITableView alloc]initWithFrame:CGRectMake(0, 0, ScreenWidth, ScreenHeight - 44) style:UITableViewStylePlain];
        self.tableView.dataSource = self;
        self.tableView.delegate = self;
        self.tableView.rowHeight = 90;
        [self.view addSubview:self.tableView];
    
        // 注册cell
        [self.tableView registerClass:[ShopCell class] forCellReuseIdentifier:identifier];
        self.tableView.tableFooterView = [[UIView alloc]init];
    }
    
    
    - (void)createBottomView{
        
        UIView *bottomView = [[UIView alloc]initWithFrame:CGRectMake(0, ScreenHeight - 44, ScreenWidth, 44)];
        [self.view addSubview:bottomView];
        
        //全选按钮
        allButton = [UIButton buttonWithType:UIButtonTypeCustom];
        allButton.frame = CGRectMake(10, 10, 24, 24);
        [allButton setImage:[UIImage imageNamed:@"radiobuttons_normal"] forState:UIControlStateNormal];
        [allButton setImage:[UIImage imageNamed:@"radiobuttons_pressed"] forState:UIControlStateSelected];
        allButton.titleLabel.font = [UIFont systemFontOfSize:14];
        allButton.contentHorizontalAlignment = UIControlContentHorizontalAlignmentRight;
        [allButton addTarget:self action:@selector(allButtonClick:) forControlEvents:UIControlEventTouchUpInside];
        allButton.selected = NO;
        [bottomView addSubview:allButton];
        
        
        UILabel * quanxuanLable = [[UILabel alloc]initWithFrame:CGRectMake(allButton.frame.origin.x + 28, allButton.frame.origin.y - 3, 30, 30)];
        quanxuanLable.text = @"全选";
        quanxuanLable.font = [UIFont systemFontOfSize:14];
        quanxuanLable.textAlignment = NSTextAlignmentLeft;
        [bottomView addSubview:quanxuanLable];
        
        moneyLable = [[UILabel alloc]initWithFrame:CGRectMake(self.view.frame.size.width/2.0 - 80, allButton.frame.origin.y, 160, 25)];
        moneyLable.textColor = [UIColor redColor];
        NSString * textStr = @"合计:¥0.00";
        NSMutableAttributedString * attributedStr = [[NSMutableAttributedString alloc]initWithString:textStr];
        NSRange range = [[attributedStr string]rangeOfString:@"合计:"];
        NSRange lastRange = NSMakeRange(range.location, range.length);
        [attributedStr addAttribute:NSForegroundColorAttributeName value:[UIColor blackColor] range:lastRange];
        [moneyLable setAttributedText:attributedStr];
        moneyLable.font = [UIFont systemFontOfSize:14];
        moneyLable.textAlignment = NSTextAlignmentCenter;
        [bottomView addSubview:moneyLable];
        
        //结算按钮
        balanceButton = [UIButton buttonWithType:UIButtonTypeSystem];
        balanceButton.frame = CGRectMake(ScreenWidth - 80, 10, 70, 40);
        balanceButton.backgroundColor = [UIColor redColor];
        [balanceButton setTitle:@"结算" forState:UIControlStateNormal];
        [balanceButton setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal];
        balanceButton.titleLabel.font = [UIFont fontWithName:@"AmericanTypewriter-Bold" size:16];
        //字体祖后面加-Bold就是加粗 加-Oblique就是倾斜
        [balanceButton addTarget:self action:@selector(balanceButtonClick:) forControlEvents:UIControlEventTouchUpInside];
        [bottomView addSubview:balanceButton];
        
        _backGrundImageView = [[UIImageView alloc]initWithFrame:CGRectMake(self.view.frame.size.width/2.0 - 120, self.view.frame.size.height/2.0 - 130, 240, 260)];
        _backGrundImageView.image = [UIImage imageNamed:@"购物车空"];
        _backGrundImageView.hidden = YES;
        [bottomView addSubview:_backGrundImageView];
    
    }
    
    #pragma mark - loadData
    
    - (void)loadData{
        
        //设置购物车的模拟数据
        for (int i = 0; i < 10; i++) {
            NSMutableDictionary * dataDic = [[NSMutableDictionary alloc]init];
            NSString * nameStr = [NSString stringWithFormat:@"商品名称%d",i];
            NSString * priceStr = [NSString stringWithFormat:@"%.1f",199.0 + i];
            [dataDic setValue:nameStr forKey:@"goodsName"];
            [dataDic setValue:priceStr forKey:@"goodsPrice"];
            [dataDic setValue:@"kiutCat.png" forKey:@"goodsImage"];
            [dataDic setValue:@"1" forKey:@"goodsCount"];
            ShopCarModel * model = [ShopCarModel modelWithDictionary:dataDic];
            [self.dataArray addObject:model];
        }
        [self.tableView reloadData];
    
    }
    
    #pragma mark - UITableView DataSource
    
    - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
        
        return self.dataArray.count;
    }
    
    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
        
        __weak typeof(self) weakSelf = self;
        
        ShopCell *cell = [tableView dequeueReusableCellWithIdentifier:identifier forIndexPath:indexPath];
        cell.model = self.dataArray[indexPath.row];
        cell.indexPath = indexPath;
        
        cell.deleteBlock = ^ (NSIndexPath *indexPath){
        
            [weakSelf.dataArray removeObjectAtIndex:indexPath.row];
            //重新计算价格
            [weakSelf sumOfAllPrice];
            // 带动画的删除该行
            [weakSelf.tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationLeft];
        };
        cell.selectedBlock = ^ (NSIndexPath *indexPath){
          
            ShopCarModel *model = weakSelf.dataArray[indexPath.row];
            model.isSelected = !model.isSelected;
            // 计算价钱 <记住要先选择再计算价钱>
            [weakSelf sumOfAllPrice];
            [weakSelf.tableView reloadData];
        };
        cell.addBlock = ^ (NSIndexPath *indexPath){
            // 取得model
            ShopCarModel *model = weakSelf.dataArray[indexPath.row];
            if (model.goodsCount == 99) {
                NSLog(@"不能再多啦!!!");
                [self showAlertView:@"不能再多啦!!!"];
                [weakSelf sumOfAllPrice];
                [weakSelf.tableView reloadData];
            }
            // 注意是 >= 1
            if (model.goodsCount >= 1) {
                model.goodsCount++;
                [weakSelf sumOfAllPrice];
                [weakSelf.tableView reloadData];
            }
        };
        cell.subTractBlock = ^ (NSIndexPath *indexPath){
            
            // 取得model
            ShopCarModel *model = weakSelf.dataArray[indexPath.row];
            if (model.goodsCount == 1) {
                NSLog(@"不能再少啦!!!");
                [self showAlertView:@"不能再少啦!!!"];
                return ;  // 让其不能再往下执行了
            }
            if (model.goodsCount < 99) {
               model.goodsCount = model.goodsCount - 1;
                [weakSelf sumOfAllPrice];
                [weakSelf.tableView reloadData];
            }
        };
        return cell;
    }
    
    #pragma mark - UITableView Delegate
    
    - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{
        
        DetailViewController *detailVc = [[DetailViewController alloc]init];
        [self.navigationController pushViewController:detailVc animated:YES];
    }
    #pragma mark - private method
    
    - (void)showAlertView: (NSString *)messageStr{
    
        UIAlertView *alertView = [[UIAlertView alloc]initWithTitle:@"提醒您哟!!!" message:messageStr delegate:self cancelButtonTitle:nil otherButtonTitles:@"确定", nil];
        [alertView show];
    
    }
    // 全选
    
    - (void)allButtonClick: (UIButton *)button{
        
        // 取反
        button.selected = !button.selected;
        for (NSInteger i = 0; i < self.dataArray.count; i++) {
            
            ShopCarModel *model = self.dataArray[i];
            model.isSelected = button.selected;
        }
        //重新计算价钱
        [self sumOfAllPrice];
        [self.tableView reloadData];
    }
    
    // 结算
    
    - (void)balanceButtonClick: (UIButton *)button{
        
        NSString *moneyStr = moneyLable.text;
        // 分割字符串
        NSArray *array = [moneyStr componentsSeparatedByString:@"合计:¥"];
        NSString *message;
        NSString *carStr;
        if (array.count == 2 && [[array objectAtIndex:1]floatValue] < 0.00000001) {
            message = @"请先选择商品哟!!!";
            carStr = @"请先选择商品哟!!!";
        }else{
            
            message = @"去结算";
            carStr = [NSString stringWithFormat:@"总计:%d元",[[array objectAtIndex:1] intValue]];
        }
        UIAlertView *alertView = [[UIAlertView alloc]initWithTitle:carStr message:message delegate:self cancelButtonTitle:nil otherButtonTitles:@"确定", nil];
        [alertView show];
    }
    
    - (void)sumOfAllPrice{
        
        for (NSInteger i = 0; i < self.dataArray.count; i++) {
            
            ShopCarModel *model = self.dataArray[i];
            if (model.isSelected) {
                priceNumber = priceNumber + model.goodsCount * [model.goodsPrice floatValue];
            }
        }
        NSString * moneyStr = [NSString stringWithFormat:@"合计:¥%0.2f",priceNumber];
        NSMutableAttributedString * attributedStr = [[NSMutableAttributedString alloc]initWithString:moneyStr];
        NSRange range = [[attributedStr string]rangeOfString:@"合计:"];
        NSRange lastRange = NSMakeRange(range.location, range.length);
        [attributedStr addAttribute:NSForegroundColorAttributeName value:[UIColor blackColor] range:lastRange];
        [moneyLable setAttributedText:attributedStr];
        moneyLable.text = [NSString stringWithFormat:@"合计:¥%0.2f",priceNumber];
        priceNumber = 0.0;
    
    }
    
    #pragma mark - 懒加载
    
    - (NSMutableArray *)dataArray{
        
        if (!_dataArray) {
            _dataArray = [NSMutableArray array];
        }
        return _dataArray;
    }
    
    @end

    刚开始有很多bug,不过应该,可能,大概解决了吧......<暂时没发现其他bug...嘿嘿嘿!!!>

    最近有点闲,有点迷茫~~~~~~还是要加油,依旧要努力~~~~~~

  • 相关阅读:
    第八次作业-非确定的自动机NFA确定化为DFA
    正规式到正规文法与自动机
    正则表达式基本介绍
    博客园源码不可copy的解决办法
    爬取湖北师范大学招生信息网中的专业简介
    利用爬虫爬取LOL官网上皮肤图片
    利用python的requests和BeautifulSoup库爬取小说网站内容
    python图像处理之PIL库
    Python之文件的使用
    python入门之jieba库的使用
  • 原文地址:https://www.cnblogs.com/pengsi/p/5782986.html
Copyright © 2011-2022 走看看