Cell等高
storyboard自定义cell
- 1.创建一个继承自UITableViewCell的子类,比如RYJDealCell

- 2.在storyboard中
- 往cell里面增加需要用到的子控件
- 设置cell的重用标识

- 设置cell的class为RYJDealCell

3.在控制器中(C)
- 利用重用标识找到cell
给cell传递模型数据
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { static NSString *ID = @"deal"; RYJDealCell *cell = [tableView dequeueReusableCellWithIdentifier:ID]; // 取出模型数据 cell.deal = self.deals[indexPath.row]; return cell; }
- 4.在RYJDeals中(M)详见MVC章节model篇
- 5.在RYJDealCell中(V)
- 将storyboard中的子控件连线到类扩展中
- 需要提供一个模型属性,重写模型的set方法,在这个方法中设置模型数据到子控件上
//.h @class RYJDeals; @interface RYJDealCell : UITableViewCell @property (nonatomic, strong) RYJDeals *deal; @end //.m @interface RYJDealCell() @property (weak, nonatomic) IBOutlet UIImageView *iconImageView; @property (weak, nonatomic) IBOutlet UILabel *titleLabel; @property (weak, nonatomic) IBOutlet UILabel *priceLabel; @property (weak, nonatomic) IBOutlet UILabel *buycountLabel; @end @implementation RYJDealCell -(void)setDeal:(RYJDeals *)deal { _deal = deal; //设置数据 self.iconImageView.image = [UIImage imageNamed:deal.icon]; self.titleLabel.text = deal.title; self.priceLabel.text = [NSString stringWithFormat:@"%@$",deal.price]; self.buycountLabel.text = deal.price; }
xib自定义cell
- 1.创建一个继承自UITableViewCell的子类,比如RYJDealCell
- 2.创建一个xib文件(文件名建议跟cell的类名一样),比如RYJDealCell.xib
- 拖拽一个UITableViewCell出来
- 修改cell的class为RYJDealCell
- 设置cell的重用标识
- 往cell中添加需要用到的子控件
3.在控制器中
- 利用registerNib...方法注册xib文件 (此方法为TableView性能优化章节cell的循环利用方式2)
UINib *nib = [UINib nibWithNibName:NSStringFromClass([XMGDealCell class]) bundle:nil]; [self.tableView registerNib:nib forCellReuseIdentifier:@"deal"]; 利用重用标识找到cell(如果没有注册xib文件,就需要手动去加载xib文件)(此方法为TableView性能优化章节cell的循环利用方式2)
static NSString *ID = @"deal"; RYJDealCell *cell = [tableView dequeueReusableCellWithIdentifier:ID]; if (cell == nil) { cell = [[[NSBundle mainBundle] loadNibNamed:NSStringFromClass([RYJDealCell class]) owner:nil options:nil] lastObject]; } return cell;给cell传递模型数据
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { // 创建cell XMGDealCell *cell = [XMGDealCell cellWithTableView:tableView]; // 取出模型数据 cell.deal = self.deals[indexPath.row]; return cell; }
- 利用registerNib...方法注册xib文件 (此方法为TableView性能优化章节cell的循环利用方式2)
- 4.在RYJDealCell中
- 将xib中的子控件连线到类扩展中
- 需要提供一个模型属性,重写模型的set方法,在这个方法中设置模型数据到子控件上
- 也可以将创建获得cell的代码封装起来(比如cellWithTableView:方法)
//RYJDealCell.h + (instancetype)cellWithTableView:(UITableView *)tableView; //RYJDealCell.m + (instancetype)cellWithTableView:(UITableView *)tableView { static NSString *ID = @"deal"; XMGDealCell *cell = [tableView dequeueReusableCellWithIdentifier:ID]; if (cell == nil) { cell = [[[NSBundle mainBundle] loadNibNamed:NSStringFromClass([XMGDealCell class]) owner:nil options:nil] lastObject]; } return cell; }
代码自定义cell(使用frame)
- 1.创建一个继承自UITableViewCell的子类,比如RYJDealCell
在initWithStyle:reuseIdentifier:方法中
添加子控件
// 1.在initWithStyle:reuseIdentifier:方法中添加子控件 -(instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier { if (self = [super initWithStyle:style reuseIdentifier:reuseIdentifier]) { UIImageView *iconView = [[UIImageView alloc] init]; [self.contentView addSubview:iconView]; self.iconView = iconView; UILabel *titleLabel = [[UILabel alloc] init]; [self.contentView addSubview:titleLabel]; self.titleLabel = titleLabel; } return self; }
- 在layoutSubviews方法中设置子控件的frame
- 设置子控件的初始化属性(比如文字颜色、字体)
// 2.在layoutSubviews方法中设置子控件的frame -(void)layoutSubviews { [super layoutSubviews]; CGFloat contentH = self.contentView.frame.size.height; CGFloat contentW = self.contentView.frame.size.width; CGFloat margin = 10; CGFloat iconX = margin; CGFloat iconY = margin; CGFloat iconW = 100; CGFloat iconH = contentH - 2 * iconY; self.iconView.frame = CGRectMake(iconX, iconY, iconW, iconH); }
- 设置子控件的初始化属性(比如文字颜色、字体)
- 需要提供一个模型属性,重写模型的set方法,在这个方法中设置模型数据到子控件
// 3.重写模型的set方法 -(void)setDeal:(XMGDeal *)deal { _deal = deal; // 设置数据 self.iconView.image = [UIImage imageNamed:deal.icon]; self.titleLabel.text = deal.title; }
- 2.在控制器中
- 利用registerClass...方法注册RYJDealCell类
- 利用重用标识找到cell(如果没有注册类,就需要手动创建cell)
- 给cell传递模型数据
- 也可以将创建获得cell的代码封装起来(比如cellWithTableView:方法)
代码自定义cell(使用autolayout)
- 1.创建一个继承自UITableViewCell的子类,比如RYJDealCell
- 在initWithStyle:reuseIdentifier:方法中
- 添加子控件
- 在layoutSubviews方法中
- 添加子控件的约束(建议使用
Masonry) - 设置子控件的初始化属性(比如文字颜色、字体)
- 添加子控件的约束(建议使用
- 需要提供一个模型属性,重写模型的set方法,在这个方法中设置模型数据到子控件
- 在initWithStyle:reuseIdentifier:方法中
- 2.在控制器中
- 利用registerClass...方法注册RYJDealCell类
- 利用重用标识找到cell(如果没有注册类,就需要手动创建cell)
- 给cell传递模型数据
- 也可以将创建获得cell的代码封装起来(比如cellWithTableView:方法)