UITableView-01基本使用
UITableView-02模型优化
UITableView-03复杂的Plist解析
UITableView-04常见属性和样式
UITableView-05可重复使用Cell-有限的创建新的cell
UITableView-06可重复使用cell-注册方式
UITableView-07索引条(综合小案例)
为什么需要自定义cell
?
系统自带的cell
无法满足用户的需求:
如以下需求:
怎么实现自定义
cell
?
- 准备阶段
1.1 继承自UITableViewControler
(1.遵循代理协议和数据源协议. 2.设置了代理和数据源对象)
1.2 懒加载 (模型存入集合)
1.2.1 创建模型,模型数据和plist文件的数据一一对应.- 2种方式将字典转换为模型
1.2.2 加载+(instancetype)groupBuyWithDict:(NSDictionary*)dict{ GroupBuy *groupBuy = [[self alloc] init]; //第一种: KVO 方式赋值 //[groupBuy setValuesForKeysWithDictionary:dict]; //第二种: groupBuy.buyCount = dict[@"buyCount"]; .... return groupBuy; }
plist文件
,获取数据.
1.2.3 字典转模型,将模型放入集合里面.-(NSArray *)tgData{ if (_tgData ==nil) { //获取plist文件的数据 NSArray *arrayTemp = [NSArray arrayWithContentsOfFile:[[NSBundle mainBundle]pathForResource:@"tgs.plist" ofType:nil]]; //字典转模型 NSMutableArray *tempArray = [NSMutableArray array]; for (NSDictionary *dict in arrayTemp) { GroupBuy *groupBuy = [GroupBuy groupBuyWithDict:dict]; [tempArray addObject:groupBuy]; } _tgData = tempArray; } return _tgData; }
-
自定义Celll
2.1 创建继承自UITableViewCell
的类
2.2 初始化cell
2.2.1- (instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(nullable NSString *)reuseIdentifier
外部无论采取注册方式还是直接创建的方式,它最终都是调用initWithStyle: reuseIdentifier:
方法.
2.2.2 调用父类方法,将子控件放在contentView
里面.
2.3 设置cell的子控件的frame//自定cell的构造方法,创建cell - (instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(nullable NSString *)reuseIdentifier{ self = [super initWithStyle:style reuseIdentifier:reuseIdentifier]; if(self){ //图片 UIImageView * imgTemp = [[UIImageView alloc]init]; [self.contentView addSubview:imgTemp]; self.iconImageView = imgTemp; .... } return self; }
2.3.1 初始化的那个时刻,子控件还没有创建出来,所以无法确认子控件的frame
.于是就有了layoutSubviews
方法.
layoutSubviews
方法,是专门用于布局子控件的方法.
2.3.2 实现父类的layoutSubviews
,设置子控件的frame
2.4 给子控件设置数据- (void)layoutSubviews{ [super layoutSubviews]; self.iconImageView.frame = CGRectMake(X, Y, W, H); } ....
2.4.1 自定义的cell类里面,设置个模型属性.用来接收数据.
2.4.2 重写set方法,set方法里面,给每个子控件设置数据.
@property(nonatomic,strong)GroupBuy *groupBuy; //模型属性
//给子控件添加数据 -(void)setGroupBuy:(GroupBuy*)groupBuy{ _groupBuy = groupBuy; self.titleLabel.text = groupBuy.title; .... }
- viewController里面设置cell的显示内容
static NSString *ID = @"tg";
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
//缓存池找对应的cell.
TGCell * cell = [tableView dequeueReusableCellWithIdentifier:ID];
if (cell == nil) {
cell = [[TGCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:ID];
}
//将数据传递给重写的模型,实现给cell的子控件赋值
cell.groupBuy = self.tgData[indexPath.row];
return cell;
}
网友评论