//
// ViewController.m
// 自定义cell_团购
//
// Created by Song on 2020/6/30.
// Copyright © 2020 Song. All rights reserved.
//
#import "ViewController.h"
#import "CZGoods.h"
#import "CZGoodsCell.h"
#import "CZFooterView.h"
#import "CZHeaderView.h"
@interface ViewController () <UITableViewDataSource, CZFooterViewDelegate>
//存储商品的数据
@property (nonatomic, strong) NSMutableArray *goods;
@property (weak, nonatomic) IBOutlet UITableView *tableView;
@end
@implementation ViewController
#pragma mark - 懒加载
- (NSMutableArray *) goods {
if(_goods == nil) {
NSString *path = [[NSBundle mainBundle] pathForResource:@"tgs.plist" ofType:nil];
NSArray *arrayDict = [NSArray arrayWithContentsOfFile:path];
NSMutableArray *arrayModels = [NSMutableArray array];
for (NSDictionary *dict in arrayDict) {
CZGoods* model = [CZGoods goodsWithDict:dict];
[arrayModels addObject:model];
}
_goods = arrayModels;
}
return _goods;
}
#pragma mark - 数据源方法
//下面这三个是必须要实现的
// 第一步,告诉视图,有多少个section需要加载到table里,这里是单个列表,所以返回就是1,之前的那种车的品牌的多个列表就是多个页表
- (NSInteger) numberOfSectionsInTableView:(UITableView *)tableView {
return 1;
}
// 第二步,告诉controller每个section需要加载多少个单元或者行。
- (NSInteger) tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
return self.goods.count;
}
// 第三步,返回UITableViewCell的实例,用于构成tablegview,这个函数是一定要实现的。
- (UITableViewCell *) tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
// 1.获取模型数据
CZGoods *model = self.goods[indexPath.row];
// 2.创建单元格
// static NSString *ID = @"goods_cell";
// UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:ID];
// if(cell == nil) {
// cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:ID];
// }
//xib创建单元格,注意创建xib的时候要新建一个类继承自UIViewCell才可以!
// 把下面的代码封装了,一是省事,而是以后万一不用xib了,方便修改。减少依赖
CZGoodsCell *cell = [CZGoodsCell goodsCellWithTableView:tableView];
// static NSString *ID = @"goods_cell";//可重用id需要在xib右侧属性设置一下
// CZGoodsCell *cell = [tableView dequeueReusableCellWithIdentifier:ID];
// if(cell == nil) {
// cell = [[[NSBundle mainBundle] loadNibNamed:@"CZGoodsCell" owner:nil options:nil] firstObject];
//
// } //firstObject代表第一个单元格
// 3.把模型数据设置给单元格
//在控制器中直接给cell的每个子控件赋值数据造成的问题:
// 1.控制器强依赖于cell,造成了紧耦合
// 2. cell的封装不够完整,凡是用到这个cell的地方,每次都要编写cell的子控件依次赋值的语句
// cell.imageView.image = [UIImage imageNamed:model.icon];
// cell.textLabel.text = model.title;
// cell.detailTextLabel.text = [NSString stringWithFormat:@"$ %@ %@人已购买", model.price, model.buyCount];
cell.goods = model;
// 4.返回单元格
return cell;
}
#pragma mark - 隐藏状态栏
- (BOOL) prefersStatusBarHidden {
return YES;
}
#pragma mark - CZFooterView的代理方法
- (void) footerViewUpdateDate:(CZFooterView *)footerView {
// 3. 增加一条数据
// 3.1 创建一个模型对象
CZGoods *model = [[CZGoods alloc] init];
model.title = @"驴肉火烧";
model.price = @"6.0";
model.buyCount = @"1000";
model.icon = @"coronavirus_01";
// 3.2 把模型对象加到控制器的goods集合当中
[self.goods addObject:model];
// 4. 刷新UITableView
[self.tableView reloadData];
// 5. 点击完之后把UITableView中的最后一行的数据滚动到最上面
NSIndexPath *idxPath = [NSIndexPath indexPathForRow:self.goods.count - 1 inSection:0];
[self.tableView scrollToRowAtIndexPath:idxPath atScrollPosition:UITableViewScrollPositionTop animated:YES];
}
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view.
self.tableView.rowHeight = 100;
//设置UITableView的footerView
// UIButton *btn = [UIButton buttonWithType:UIButtonTypeContactAdd];
// btn.backgroundColor = [UIColor redColor];
// //tableView 的 footview 只能修改x 和 y 不能修改 长和宽
// btn.frame = CGRectMake();
// self.tableView.tableFooterView = btn;
//通过xib设置UITableView的footerView
//CZFooterView *footerView = [[[NSBundle mainBundle] loadNibNamed:@"CZFooterView" owner:nil options:nil] lastObject];
//把上面的给封装了
CZFooterView *footerView = [CZFooterView footerView];
//设置footerView的代理
footerView.delegate = self;
self.tableView.tableFooterView = footerView;
//创建HeaderView
// CZHeaderView *headerView = [[[NSBundle mainBundle] loadNibNamed:@"CZHeaderView" owner:nil options:nil] firstObject];
CZHeaderView *headerView = [CZHeaderView headerView];
self.tableView.tableHeaderView = headerView;
}
@end
//
// CZFooterView.m
// 自定义cell_团购
//
// Created by Song on 2020/7/2.
// Copyright © 2020 Song. All rights reserved.
//
#import "CZFooterView.h"
@interface CZFooterView()
@property (weak, nonatomic) IBOutlet UIButton *btnLoadMore;
@property (weak, nonatomic) IBOutlet CZFooterView *waitingView;
- (IBAction)btnLoadMoreClick;
@end
@implementation CZFooterView
/*
// Only override drawRect: if you perform custom drawing.
// An empty implementation adversely affects performance during animation.
- (void)drawRect:(CGRect)rect {
// Drawing code
}
*/
+ (instancetype)footerView{
CZFooterView *footerView = [[[NSBundle mainBundle] loadNibNamed:@"CZFooterView" owner:nil options:nil] lastObject];
return footerView;
}
//加载更多按钮的单击事件
- (IBAction)btnLoadMoreClick {
// 1. 隐藏“加载更多”按钮
self.btnLoadMore.hidden = YES;
// 2. 显示“等待指示器”所在的那个UIView
self.waitingView.hidden = NO;
//点击之后隔一秒钟
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
// 调用代理方法实现下面的功能
// 调用footerViewUpdateDate方法之前,为了保证调用不出错,所以要先判断一下是否真的实现了这个方法,如果真的实现了这个方法仔调用,否则不调用
if([self.delegate respondsToSelector:@selector(footerViewUpdateDate:)]) {
[self.delegate footerViewUpdateDate:self];
}
// 显示“加载更多”按钮
self.btnLoadMore.hidden = NO;
// 隐藏“等待指示器”所在的那个UIView
self.waitingView.hidden = YES;
// 3. 增加一条数据
// 3.1 创建一个模型对象
// 3.2 把模型对象加到控制器的goods集合当中
// 4. 刷新UITableView
});
}
@end
//
// CZHeaderView.m
// 自定义cell_团购
//
// Created by Song on 2020/7/3.
// Copyright © 2020 Song. All rights reserved.
//
#import "CZHeaderView.h"
@interface CZHeaderView()
@property (weak, nonatomic) IBOutlet UIScrollView *scrollView;
@end
@implementation CZHeaderView
//当这个方法被执行的时候就表示CZHeaderViewer已经从xib中创建好了,那么也就意味着在CZHeaderViewer中的所有子控件都创建好了,就可以使用scrollView了
//- (void) awakeFromNib {
// // 在这里就表示CZHeaderView已经从xib中创建好了。
// self.scrollView.contentSize = ...;
//}
+ (instancetype) headerView {
CZHeaderView *headerView = [[[NSBundle mainBundle] loadNibNamed:@"CZHeaderView" owner:nil options:nil] firstObject];
return headerView;
}
@end
//
// CZGoods.m
// 自定义cell_团购
//
// Created by Song on 2020/6/30.
// Copyright © 2020 Song. All rights reserved.
//
#import "CZGoods.h"
@implementation CZGoods
- (instancetype) initWithDict:(NSDictionary *)dict {
if(self = [super init]) {
[self setValuesForKeysWithDictionary:dict];
}
return self;
}
+ (instancetype) goodsWithDict:(NSDictionary *)dict {
return [[self alloc] initWithDict:dict];
}
@end