步骤一:建立xib,描述自定义cell的外观。(UIImageView,3个UILabel)数组
步骤二:取消Autolayout缓存
步骤三:实现数据源方法ide
步骤四:经过代理方法,设置cell的高度。字体
补充:若是全部行同样,用rowHeigth属性设置高度,不同用代理设置高度。atom
步骤五:设置xib中重用标识符。spa
步骤六:建立模型对象News(title,icon,comments,author)代理
步骤七:解析pilst文件转成模型数据对象
步骤八:建立自定义cell类,而且属性与xib连线。(不要依赖控制器)继承
步骤九:自定义cell提供一个类方法接口给外界。接口
步骤十:在外界直接使用自定义cell。
注意xib名称要和类名名称同样
@property (nonatomic, strong) Deal *deal;
+ (id)dealCell;
+ (id)dealCell
{
return [[NSBundle mainBundle] loadNibNamed:@"DealCell" owner:nil options:nil][0];
}
+ (CGFloat)cellHeight;
+ (CGFloat)cellHeight
{
return 80;
}
每一行cell高度同样,使用这个方法
每一行,高度不同,使用代理方法
思路:项目中cell中内部控件高度不同,最好用代码建立自定义cell。
步骤一:建立自定义cell。
步骤二:在下面方法中描述cell。
- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
位置计算注意:计算文字高度时,若是UILabel不须要换行,根据字体算出尺寸,使用如下方法。
- (CGSize)sizeWithFont:(UIFont *)font;
若是UILabel须要换行,使用使用如下方法.
5.因为返回每一行高度比返回每一行cell内容先调用。所以获取每一行的高度,不能直接从cell对象中获取,由于那时候还没建立cell对象,所以咱们须要另外建立一个模型,用来管理cell内部全部子控件的frame和cell的总高度。
6.在viewDidLoad方法中,就将cellFrame模型用数组保存起来.
7.实现数据源方法。
若是tableView经过identifier这个标志去缓冲池中没有取到可循环利用的cell,就会加载xib文件来建立。
- (void)registerNib:(UINib *)nib forCellReuseIdentifier:(NSString *)identifier
若是tableView经过identifier这个标志去缓冲池中没有取到可循环利用的cell,就会加载cellClass类来建立。
-(void)registerClass:(Class)cellClass forCellReuseIdentifier:(NSString *)identifier
1、加载xib文件的两种方式 1.方法一(NewsCell是xib文件的名称) NSArray *objects = [[NSBundle mainBundle] loadNibNamed:@"NewsCell" owner:nil options:nil];
2.方法二 UINib *nib = [UINib nibWithNibName:@"NewsCell" bundle:nil]; NSArray *objects = [nib instantiateWithOwner:nil options:nil];
2、设置cell的高度 1.若是每一行cell的高度都是同样的,直接使用tableView的rowHeight属性设置cell的高度便可 tableView.rowHeight = 80;
2.若是每一行cell的高度不必定同样,应该用代理方法设置cell的高度 - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { // 返回indexPath这行对应cell的高度 return 80; }
3、UITableViewController 1.UITableViewController内部默认会建立一个UITableView *tableView 2.UITableViewController内部tableView的delegate(代理)和dataSource(数据源)就是这个UITableViewController 3.UITableViewController内部tableView就是控制器的view
4、自定义cell 1.经过xib 1> 必定要注意在xib的cell中设置重用标识(reuse identifier)
2> 封装的步骤 * 新建xib描述cell的样子---DealCell.xib * 新建UITableViewCell的子类---DealCell(封装xib内部的全部东西) * 修改xib中cell的类名(class)为DealCell * 在DealCell中拥有xib中的全部子控件(声明属性、进行连线) * 新建模型Deal,封装数据 * 给DealCell增长模型属性 @property (nonatomic, strong) Deal *deal; * 重写setDeal:方法,在这个方法中根据模型数据设置cell内部子控件的属性 * 提供一个类方法,返回从xib中建立好的cell对象 * 给xib中的cell添加一个重用标识(好比deal),提供一个类方法,返回重用标识 * 提供一个类方法,返回cell的高度
3> 使用cell * 设置每一行cell的高度 * 利用重用标识去缓存池取得cell * 若是缓存池没有cell,建立cell * 传递模型给cell
2.经过代码 1> 新建一个UITableViewCell的子类---WeiboCell
2> 在建立cell的时候(initWithStyle:reuseIdentifier:方法中)添加cell内部须要使用的子控件 (注意:只管建立添加子控件,先不要去管子控件的位置和尺寸)
3> 新建一个模型类---Weibo,增长对应的数据属性
4> 给WeiboCell增长一个Weibo模型属性,在拿到Weibo模型数据的同时设置子控件的属性
5> 重写setWeibo:方法,在这里面取出Weibo模型的数据显示到子控件上
5、UITableView方法补充 1.若是tableView经过@"Cell"这个标志去缓存池中没有取到可循环利用的Cell,就会加载MyCell1.xib文件来建立cell [self.tableView registerNib:[UINib nibWithNibName:@"MyCell1" bundle:nil] forCellReuseIdentifier:@"Cell"];
2.若是tableView经过@"cell2"这个标志去缓存池中没有取到可循环利用的Cell,就会建立MyCell2对象做为cell [self.tableView registerClass:[MyCell2 class] forCellReuseIdentifier:@"cell2"];