整理一個簡單的購物車小demo。主要利用“通知”來實現(xiàn)事件的傳遞。通知的發(fā)布和監(jiān)聽、移除通知。(資料來源于小碼哥)
- UITableView 搭建基本骨架、加減按鈕的圓角邊框處理、底部工具條及數(shù)據(jù)顯示
- model
- UITableViewCell 自定義
- NSNotificationCenter 監(jiān)聽發(fā)布及移除
效果圖.png
如上圖所示:點擊加減按鈕可以改變購物數(shù)量,底部工具條上的總價也隨之變化計算出相應(yīng)的價格總和。減號按鈕、清空購物車按鈕 默認(rèn)不能點擊,當(dāng)數(shù)量大于0時可以點擊。
model.m文件
#import <Foundation/Foundation.h>
@interface MRootModle : NSObject
@property (copy, nonatomic) NSString *money;
@property (copy, nonatomic) NSString *name;
@property (copy, nonatomic) NSString *image;
//
@property (nonatomic,assign)int count;
@end
RootViewController.m文件
#import "RootViewController.h"
#import "RootTableViewCell.h"
#import "MRootModle.h"
#import "MJExtension.h"
#define ScreenWidth [UIScreen mainScreen].bounds.size.width
#define ScreenHeight [UIScreen mainScreen].bounds.size.height
@interface RootViewController ()<UITableViewDelegate,UITableViewDataSource>
@property (nonatomic,strong)UITableView *tableView;
@property (nonatomic,strong)NSArray *dataArray;//數(shù)據(jù)源
@property (nonatomic,strong)UILabel *priceLabel;//總價價格
@property (nonatomic,strong)UILabel *zongjiaLabel;//總價
@property (nonatomic,strong)UIButton *clearBtn;//清空購物車
@property (nonatomic,strong)UIButton *buyBtn;//購物
@end
@implementation RootViewController
//數(shù)據(jù)源
- (NSArray *)dataArray{
if (!_dataArray) {
_dataArray = [MRootModle mj_objectArrayWithFilename:@"wine.plist"];
}
return _dataArray;
}
- (UITableView *)tableView{
if (!_tableView) {
_tableView = [[UITableView alloc]initWithFrame:CGRectMake(0, 0,ScreenWidth, ScreenHeight-49) style:UITableViewStylePlain];
_tableView.delegate = self;
_tableView.dataSource = self;
_tableView.tableFooterView = [[UIView alloc]init];
}
return _tableView;
}
- (void)viewDidLoad {
[super viewDidLoad];
self.navigationItem.title = @"購物車";
[self.view addSubview:self.tableView];
[self creatFootView];
//監(jiān)聽通知
NSNotificationCenter *center = [NSNotificationCenter defaultCenter];
[center addObserver:self selector:@selector(plusClick:) name:@"plusClickNSNotification" object:nil];
[center addObserver:self selector:@selector(minusClick:) name:@"minusClickNSNotification" object:nil];
}
- (void)creatFootView{
//底部View
UIView *footView = [[UIView alloc]initWithFrame:CGRectMake(0, ScreenHeight-49, ScreenWidth, 49)];
footView.backgroundColor = [UIColor whiteColor];
[self.view addSubview:footView];
//黑線
UIView *line = [[UIView alloc]initWithFrame:CGRectMake(0, ScreenHeight-49, ScreenWidth, 1)];
line.backgroundColor = [UIColor blackColor];
line.alpha = 0.3;
[self.view addSubview:line];
//總價
_zongjiaLabel = [[UILabel alloc]initWithFrame:CGRectMake(15, 8, 60, 33)];
_zongjiaLabel.font = [UIFont systemFontOfSize:15];
_zongjiaLabel.text =@"總價:¥";
[footView addSubview:_zongjiaLabel];
//
_priceLabel = [[UILabel alloc]initWithFrame:CGRectMake(65, 8, 100, 33)];
_priceLabel.text = @"0";
_priceLabel.textColor = [UIColor redColor];
[footView addSubview:_priceLabel];
//購物
_buyBtn = [UIButton buttonWithType:UIButtonTypeCustom];
_buyBtn.frame = CGRectMake(ScreenWidth - 160, 8, 40, 33);
[_buyBtn setTitle:@"購物" forState:UIControlStateNormal];
[_buyBtn setTitleColor:[UIColor grayColor] forState:UIControlStateNormal];
_buyBtn.font = [UIFont systemFontOfSize:17];
[_buyBtn addTarget:self action:@selector(buyClick:) forControlEvents:UIControlEventTouchUpInside];
[footView addSubview:_buyBtn];
//清空購物車
_clearBtn = [UIButton buttonWithType:UIButtonTypeCustom];
_clearBtn.frame = CGRectMake(ScreenWidth-160, 8, 200, 33);
[_clearBtn setTitle:@"清空購物車" forState:UIControlStateNormal];
[_clearBtn setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
_clearBtn.font = [UIFont systemFontOfSize:17];
[_clearBtn addTarget:self action:@selector(clearClick:) forControlEvents:UIControlEventTouchUpInside];
[footView addSubview:_clearBtn];
}
//購買
- (void)buyClick:(UIButton *)btn{
NSLog(@"購買");
}
//清空購物車
- (void)clearClick:(UIButton *)btn{
//清除模型里的數(shù)據(jù)
for (MRootModle *model in _dataArray) {
model.count = 0;
}
//刷新表格數(shù)據(jù)
[self.tableView reloadData];
self.priceLabel.text = @"0";
self.clearBtn.enabled = NO;
NSLog(@"清空購物車");
}
//減號的通知事件
- (void)plusClick:(NSNotification *)notif{
RootTableViewCell *cell =notif.object;
int price =self.priceLabel.text.intValue+cell.model.money.intValue;
//如果有文字就不行轉(zhuǎn)換
_priceLabel.text = [NSString stringWithFormat:@"%d",price];
if (price>0) {
_clearBtn.enabled = YES;
[_buyBtn setTitleColor:[UIColor blueColor] forState:UIControlStateNormal];
}
}
//加號的通知事件
- (void)minusClick:(NSNotification *)notif{
RootTableViewCell *cell = notif.object;
int price = self.priceLabel.text.intValue - cell.model.money.intValue;
_priceLabel.text =[NSString stringWithFormat:@"%d",price];
if (price==0) {
_clearBtn.enabled = NO;
[_buyBtn setTitleColor:[UIColor grayColor] forState:UIControlStateNormal];
}
}
- (void)dealloc{
//移除通知
[[NSNotificationCenter defaultCenter]removeObserver:self];
}
/**
代理
*/
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
return self.dataArray.count;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
RootTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"iden"];
if (cell == nil) {
cell= [[RootTableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"iden"];
}
cell.model =_dataArray[indexPath.row];
cell.selectionStyle = UITableViewCellSelectionStyleNone;
return cell;
}
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{
[tableView deselectRowAtIndexPath:indexPath animated:YES];
}
TableViewCell.m文件
@interface RootTableViewCell ()
@property (nonatomic,strong)UIButton *jiaBtn;
@property (nonatomic,strong)UIButton *jianBtn;
@property (nonatomic,strong)UILabel *numLabel;
@property (nonatomic,strong)UIImageView *headerImageView;
@property (nonatomic,strong)UILabel *titletLabel;
@property (nonatomic,strong)UILabel *danjiaLabel;
@end
@implementation RootTableViewCell
- (instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier{
if ([super initWithStyle:style reuseIdentifier:reuseIdentifier]) {
[self createUI];
}
return self;
}
- (void)createUI{
//圖片
_headerImageView = [[UIImageView alloc]initWithFrame:CGRectMake(10, 2, 40, 40)];
_headerImageView.backgroundColor = [UIColor brownColor];
[self.contentView addSubview:_headerImageView];
//題目
_titletLabel = [[UILabel alloc]initWithFrame:CGRectMake(53, 0, 200, 30)];
_titletLabel.textColor = [UIColor orangeColor];
_titletLabel.font = [UIFont systemFontOfSize:11];
[self.contentView addSubview:_titletLabel];
//單價
_danjiaLabel = [[UILabel alloc]initWithFrame:CGRectMake(53, 25, 50, 20)];
_danjiaLabel.textColor = [UIColor orangeColor];
_danjiaLabel.font = [UIFont systemFontOfSize:11];
[self.contentView addSubview:_danjiaLabel];
//加號button
_jiaBtn = [UIButton buttonWithType:UIButtonTypeCustom];
_jiaBtn.frame = CGRectMake(ScreenWidth-50, 5, 35, 35);
[_jiaBtn setTitleColor:[UIColor blueColor] forState:UIControlStateNormal];
[_jiaBtn setTitle:@"+" forState:UIControlStateNormal];
[_jiaBtn addTarget:self action:@selector(jiaClick) forControlEvents:UIControlEventTouchUpInside];
[self custombutton:_jiaBtn];
//數(shù)量
_numLabel =[[UILabel alloc]initWithFrame:CGRectMake(ScreenWidth - 80, 12, 20, 20)];
_numLabel.font = [UIFont systemFontOfSize:11];
[self.contentView addSubview:_numLabel];
//減號button
_jianBtn = [UIButton buttonWithType:UIButtonTypeSystem];
[_jianBtn setTitle:@"-" forState:UIControlStateNormal];
_jianBtn.frame =CGRectMake(ScreenWidth-140, 5, 35, 35);
_jianBtn.enabled = NO;
[_jianBtn addTarget:self action:@selector(jianClick) forControlEvents:UIControlEventTouchUpInside];
[self custombutton:_jianBtn];
}
-(void)setModel:(MRootModle *)model{
_model =model;
NSLog(@"%@",model.image);
_headerImageView.image =[UIImage imageNamed:model.image];
_titletLabel.text = model.name;
_danjiaLabel.text = [NSString stringWithFormat:@"¥%@",model.money];
_numLabel.text =[NSString stringWithFormat:@"%d",model.count];
//判斷減號能不能用
_jianBtn.enabled = (_model.count>0);
}
// + 按鈕
- (void)jiaClick{
NSLog(@"加一件");
self.model.count++;
_numLabel.text =[NSString stringWithFormat:@"%d",self.model.count];
if (_model.count>0) {
self.jianBtn.enabled = YES;
}
//發(fā)布通知
[[NSNotificationCenter defaultCenter]postNotificationName:@"plusClickNSNotification" object:self];
}
// — 按鈕
- (void)jianClick{
self.model.count--;
_numLabel.text =[NSString stringWithFormat:@"%d",self.model.count];
if (!(self.model.count>0)) {
_numLabel.text =[NSString stringWithFormat:@"0"];
_jianBtn.enabled =NO;
}
//發(fā)布通知
[[NSNotificationCenter defaultCenter]postNotificationName:@"minusClickNSNotification" object:self];
NSLog(@"減一件");
}
//處理加減按鈕的圓角邊框
- (void)custombutton:(UIButton *)btn{
btn.layer.cornerRadius = btn.frame.size.width*0.5;
btn.layer.borderWidth = 1;
btn.layer.borderColor = [UIColor orangeColor].CGColor;
[btn setTitleColor:[UIColor grayColor] forState:UIControlStateHighlighted];
btn.titleLabel.font = [UIFont systemFontOfSize:25];
[self.contentView addSubview:btn];
}
當(dāng)然也可以用KVO來關(guān)聯(lián)view與model。取代通知下面貼出代碼:
- (NSArray *)wineArray
{
if (!_wineArray) {
_wineArray = [XMGWine mj_objectArrayWithFilename:@"wine.plist"];
NSLog(@"數(shù)據(jù)源%@",_wineArray);
for (XMGWine *wine in _wineArray) {
[wine addObserver:self forKeyPath:@"count" options:NSKeyValueObservingOptionNew| NSKeyValueObservingOptionOld context:nil];
}
}
return _wineArray;
}
- (void)viewDidLoad {
[super viewDidLoad];
}
- (void)dealloc {
for (XMGWine *wine in _wineArray) {
[wine removeObserver:self forKeyPath:@"count"];
}
}
#pragma mark - KVO
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(XMGWine *)wine change:(NSDictionary<NSString *,id> *)change context:(void *)context{
// NSKeyValueChangeNewKey == @"new"
int new = [change[NSKeyValueChangeNewKey] intValue];
// NSKeyValueChangeOldKey == @"old"
int old = [change[NSKeyValueChangeOldKey] intValue];
if (new > old) { // 數(shù)量增加,點擊加號
// 計算總價
int totalPrice = self.totalPriceLabel.text.intValue + wine.money.intValue;
// 設(shè)置總價
self.totalPriceLabel.text = [NSString stringWithFormat:@"%d",totalPrice];
// 購買按鈕一定能點擊
self.buyButton.enabled = YES;
} else { // 數(shù)量減少,點擊減號
// 計算總價
int totalPrice = self.totalPriceLabel.text.intValue - wine.money.intValue;
// 設(shè)置總價
self.totalPriceLabel.text = [NSString stringWithFormat:@"%d",totalPrice];
// 控制購買按鈕是否能點擊
self.buyButton.enabled = (totalPrice > 0);
}
}