首页 > 代码库 > 自定cell(XIB)团购思路
自定cell(XIB)团购思路
自定cell(XIB)团购思路
步骤一、先解析plist文件,创建model层数据。
- (instancetype)initWithDict:(NSDictionary*)dict
{
self = [superinit];
if (self) {
[selfsetValuesForKeysWithDictionary:dict];
}
return self;
}
+ (instancetype)tgWithDict:(NSDictionary*)dict
{
return [[selfalloc]initWithDict:dict];
}
+ (NSMutableArray*)tgs
{
NSArray *array = [NSArrayarrayWithContentsOfFile:[[NSBundlemainBundle]pathForResource:@"tgs.plist"ofType:nil]];
NSMutableArray *arrayM = [NSMutableArrayarray];
for (NSDictionary*dict in array) {
[arrayM addObject:[selftgWithDict:dict]];
}
return arrayM;
}
{
self = [superinit];
if (self) {
[selfsetValuesForKeysWithDictionary:dict];
}
return self;
}
+ (instancetype)tgWithDict:(NSDictionary*)dict
{
return [[selfalloc]initWithDict:dict];
}
+ (NSMutableArray*)tgs
{
NSArray *array = [NSArrayarrayWithContentsOfFile:[[NSBundlemainBundle]pathForResource:@"tgs.plist"ofType:nil]];
NSMutableArray *arrayM = [NSMutableArrayarray];
for (NSDictionary*dict in array) {
[arrayM addObject:[selftgWithDict:dict]];
}
return arrayM;
}
二、自定义Cell
1> 创建XIB文件,并设置控件内部细节。
2> 创建一个与XIB同名的类,注意自定义的类继承自的对象,要与XIB中根对象的类保持一致。
3> 重新指定XIB中的根类,打开助理编辑器辅助观察变化。
4> 对需要修改属性的控件做IBOutlet连线,注意,不要与TableViewCell的已经存在的属性重名
连线控件的名称不能是:
(1) textLabel
(2) detailTextLabel
(3) imageView
2> 创建一个与XIB同名的类,注意自定义的类继承自的对象,要与XIB中根对象的类保持一致。
3> 重新指定XIB中的根类,打开助理编辑器辅助观察变化。
4> 对需要修改属性的控件做IBOutlet连线,注意,不要与TableViewCell的已经存在的属性重名
连线控件的名称不能是:
(1) textLabel
(2) detailTextLabel
(3) imageView
+ (instancetype)cellWithTableView:(UITableView*)tableView
{
// 1. 可重用标示符
static NSString *ID =@"Cell";
// 2. tableView查询可重用Cell
HMTgCell *cell = [tableViewdequeueReusableCellWithIdentifier:ID];
// 3. 如果没有可重用cell
if (cell ==nil) {
NSLog(@"加载XIB");
// 从XIB加载自定义视图
cell = [[[NSBundlemainBundle]loadNibNamed:@"HMTgCell"owner:niloptions:nil]lastObject];
}
return cell;
}
- (void)setTg:(HMTg*)tg
{
// setter方法中,第一句要赋值,否则要在其他方法中使用模型,将无法访问到
_tg = tg;
self.titleLabel.text= tg.title;
self.iconView.image= [UIImageimageNamed:tg.icon];
self.priceLabel.text= tg.price;
self.buyCountLabel.text= tg.buyCount;
}
#pragma mark -模板提供的方法
/**
初始化方法
使用代码创建Cell的时候会被调用,如果使用XIB或者Storyboard,此方法不会被调用
*/
- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString*)reuseIdentifier
{
self = [superinitWithStyle:stylereuseIdentifier:reuseIdentifier];
if (self) {
NSLog(@"%s", __func__);
}
return self;
}
/**
从XIB被加载之后,会自动被调用,如果使用纯代码,不会被执行
*/
- (void)awakeFromNib
{
NSLog(@"%s", __func__);
self.contentView.backgroundColor= [UIColorclearColor];
}
/**
Cell 被选中或者取消选中是都会被调用
如果是自定义Cell控件,所有的子控件都应该添加到contentView中
*/
- (void)setSelected:(BOOL)selected animated:(BOOL)animated
{
[supersetSelected:selectedanimated:animated];
if (selected) {
self.contentView.backgroundColor= [UIColorredColor];
} else {
self.contentView.backgroundColor= [UIColorgreenColor];
}
}
{
// 1. 可重用标示符
static NSString *ID =@"Cell";
// 2. tableView查询可重用Cell
HMTgCell *cell = [tableViewdequeueReusableCellWithIdentifier:ID];
// 3. 如果没有可重用cell
if (cell ==nil) {
NSLog(@"加载XIB");
// 从XIB加载自定义视图
cell = [[[NSBundlemainBundle]loadNibNamed:@"HMTgCell"owner:niloptions:nil]lastObject];
}
return cell;
}
- (void)setTg:(HMTg*)tg
{
// setter方法中,第一句要赋值,否则要在其他方法中使用模型,将无法访问到
_tg = tg;
self.titleLabel.text= tg.title;
self.iconView.image= [UIImageimageNamed:tg.icon];
self.priceLabel.text= tg.price;
self.buyCountLabel.text= tg.buyCount;
}
#pragma mark -模板提供的方法
/**
初始化方法
使用代码创建Cell的时候会被调用,如果使用XIB或者Storyboard,此方法不会被调用
*/
- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString*)reuseIdentifier
{
self = [superinitWithStyle:stylereuseIdentifier:reuseIdentifier];
if (self) {
NSLog(@"%s", __func__);
}
return self;
}
/**
从XIB被加载之后,会自动被调用,如果使用纯代码,不会被执行
*/
- (void)awakeFromNib
{
NSLog(@"%s", __func__);
self.contentView.backgroundColor= [UIColorclearColor];
}
/**
Cell 被选中或者取消选中是都会被调用
如果是自定义Cell控件,所有的子控件都应该添加到contentView中
*/
- (void)setSelected:(BOOL)selected animated:(BOOL)animated
{
[supersetSelected:selectedanimated:animated];
if (selected) {
self.contentView.backgroundColor= [UIColorredColor];
} else {
self.contentView.backgroundColor= [UIColorgreenColor];
}
}
三、在控制器实现UITableView的代理方法
#pragma mark -数据源方法
- (NSInteger)tableView:(UITableView*)tableView numberOfRowsInSection:(NSInteger)section
{
return self.tgs.count;
}
- (UITableViewCell*)tableView:(UITableView*)tableView cellForRowAtIndexPath:(NSIndexPath*)indexPath
{
// 1. 创建cell
HMTgCell *cell = [HMTgCellcellWithTableView:tableView];
// 2. 通过数据模型,设置Cell内容,可以让视图控制器不需要了解cell内部的实现细节
cell.tg= self.tgs[indexPath.row];
return cell;
}
- (NSInteger)tableView:(UITableView*)tableView numberOfRowsInSection:(NSInteger)section
{
return self.tgs.count;
}
- (UITableViewCell*)tableView:(UITableView*)tableView cellForRowAtIndexPath:(NSIndexPath*)indexPath
{
// 1. 创建cell
HMTgCell *cell = [HMTgCellcellWithTableView:tableView];
// 2. 通过数据模型,设置Cell内容,可以让视图控制器不需要了解cell内部的实现细节
cell.tg= self.tgs[indexPath.row];
return cell;
}
四、自定义点击开始下载XIB
+ (instancetype)footerView
{
return [[[NSBundlemainBundle]loadNibNamed:@"HMTgFooterView"owner:niloptions:nil]lastObject];
}
- (IBAction)loadMore
{
NSLog(@"加载更多");
// 1. 隐藏按钮
self.loadMoreButton.hidden= YES;
// 2. 显示提示视图
self.tipsView.hidden= NO;
// 3.1 判断代理是否实现了协议方法
if ([self.delegaterespondsToSelector:@selector(tgFooterViewDidDownloadButtonClick:)]) {
[self.delegatetgFooterViewDidDownloadButtonClick:self];
}
}
/**视图控制器刷新完成调用方法*/
{
return [[[NSBundlemainBundle]loadNibNamed:@"HMTgFooterView"owner:niloptions:nil]lastObject];
}
- (IBAction)loadMore
{
NSLog(@"加载更多");
// 1. 隐藏按钮
self.loadMoreButton.hidden= YES;
// 2. 显示提示视图
self.tipsView.hidden= NO;
// 3.1 判断代理是否实现了协议方法
if ([self.delegaterespondsToSelector:@selector(tgFooterViewDidDownloadButtonClick:)]) {
[self.delegatetgFooterViewDidDownloadButtonClick:self];
}
}
/**视图控制器刷新完成调用方法*/
在XIB添加View和Button,加载完数据之后,View隐藏,Button显示。
- (void)endRefresh
{
// 4. 加载完成数据
self.loadMoreButton.hidden= NO;
self.tipsView.hidden= YES;
}
- (void)endRefresh
{
// 4. 加载完成数据
self.loadMoreButton.hidden= NO;
self.tipsView.hidden= YES;
}
五、自定义协议,当点击开始下载按钮,通知控制器
@protocolHMTgFooterViewDelegate <NSObject>
@optional
/**视图的下载按钮被点击*/
- (void)tgFooterViewDidDownloadButtonClick:(HMTgFooterView*)footerView;
@end
@optional
/**视图的下载按钮被点击*/
- (void)tgFooterViewDidDownloadButtonClick:(HMTgFooterView*)footerView;
@end
- (void)tgFooterViewDidDownloadButtonClick:(HMTgFooterView*)footerView
{
// 模拟取网络上获取数据加载数据
NSLog(@"努力加载数据中....");
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2.0* NSEC_PER_SEC)),dispatch_get_main_queue(), ^{
// 获得网络数据之后执行的操作
// 向数组中添加数据,模拟网络加载完成之后的效果
NSDictionary *dict =@{@"title":@"哈哈",@"icon":@"ad_00",@"price":@"100.2",@"buyCount":@"250"};
HMTg *tg = [HMTgtgWithDict:dict];
NSLog(@"加数据前%d",self.tgs.count);
[self.tgsaddObject:tg];
NSLog(@"加数据后%d",self.tgs.count);
// 刷新数据
// [self.tableView reloadData];
// 新建一个indexPath
NSIndexPath *path = [NSIndexPathindexPathForRow:(self.tgs.count- 1) inSection:0];
[self.tableViewinsertRowsAtIndexPaths:@[path]withRowAnimation:UITableViewRowAnimationMiddle];
// 通知页脚视图调整视图显示状态
[footerView endRefresh];
});
}
{
// 模拟取网络上获取数据加载数据
NSLog(@"努力加载数据中....");
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2.0* NSEC_PER_SEC)),dispatch_get_main_queue(), ^{
// 获得网络数据之后执行的操作
// 向数组中添加数据,模拟网络加载完成之后的效果
NSDictionary *dict =@{@"title":@"哈哈",@"icon":@"ad_00",@"price":@"100.2",@"buyCount":@"250"};
HMTg *tg = [HMTgtgWithDict:dict];
NSLog(@"加数据前%d",self.tgs.count);
[self.tgsaddObject:tg];
NSLog(@"加数据后%d",self.tgs.count);
// 刷新数据
// [self.tableView reloadData];
// 新建一个indexPath
NSIndexPath *path = [NSIndexPathindexPathForRow:(self.tgs.count- 1) inSection:0];
[self.tableViewinsertRowsAtIndexPaths:@[path]withRowAnimation:UITableViewRowAnimationMiddle];
// 通知页脚视图调整视图显示状态
[footerView endRefresh];
});
}
自定cell(XIB)团购思路
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。