tableview的学习
- indexPath.section 组
- indexPath.row 行
1.每个cell对应一个模型
2.每个section对应3个模型,头部,底部,cell模型
每个tableview中申明一个可变数组存储每个模型数据.
数据模型写类方法,将字典转为模型
- 重写可变数组的set方法(将模型存入).
tableview的性能优化
- 设置identifier的标识
// 由于优化性能,避免NSString *ID = @"cell"重复创建
NSString *ID = @"cell
// 所以加static NSString *ID = @"cell"
static NSString *ID = @"cell"
// 被static修饰的局部变量,只会初始化一次,在整个程序运行过程中,只有一份内存.
- 先通过identifier查找可用cell
- 如果cell为空通过identifier创建cell
- 覆盖数据
1 或者在viewDidLoad中通过tableview注册cell
[self.tableview registerClass:[UITableViewCell class] forCellReuseIdentifier:ID];
第三种方式创建tableview
- 通过storyboard tableviewController给cell添加identifier,创建不同的cell
- storyboard中要选择动态添加cell(Dynamic Prototype)
// tableview常见设置
// 设置分割线颜色
self.tableview.separator = [UIColor redColor]
// 设置cell之间没有分割线
self.tableview.separatorStyle = UITableViewCellSeparatorStyleNone;
// tableviewCell常见设置
// 设置cell的点击效果
cell.selectionStyle = UITableViewCellSelectionStyleNo
// 设置选中背景色
cell.selectedBackgroundView
// 设置默认的背景色
cell.backgroundColor
cell.backgroundView 优先级高于Color
// 设置指示器
cell.accessoryType
cell.accessoryView
自定义cell
- 等高Cell
-
通过storyboard自定义cell
- 1.创建一个继承自UITableViewCell的子类.
- 2在storyboard中
- 往cell里面增加需要用到的子控件
- 设置cell重用标识符
- 设置cell的Class
- 3.在控制器中
- 利用重用标识符找到cell
- 给cell传递模型
- 4.在cell的Class中
- 将子控件连线到Class的类扩展中
- 需要提供模型属性,重写模型的set方法,在这个方法中设置模型数据到子控件上
-
通过xib自定义cell
- 1.创建一个继承UITableViewCell子类
- 2.创建一个xib文件,文件名建议和xib一样
- 拖拽一个UITableViewCell
- 修改cell的Class
- 设置重用标识
- 往cell中添加需要用到的子控件
- 3.在控制器中
- 利用registerNib....注册xib文件
- 利用重用标识找cell (如果没有注册xib文件,就需要手动加载xib文件)
- 4.将xib中文件子控件练习到Class中
- 需要提供模型属性,重写模型的set方法,在这个方法中设置模型数据到子控件上
-
通过代码自定义cell
- 1.创建一个继承UITableViewCell子类
- 在initWithStyle:reuseIdentifier:方法中
- 添加子控件
- 设置子控件初始化属性(字体,颜色)
- 在layoutSubviews方法中,设置子控件frame
(建议用masonry设置autolayout
) - 需要提供模型属性,重写模型的set方法,在这个方法中设置模型数据到子控件上
- 在initWithStyle:reuseIdentifier:方法中
- 2.控制器中
- 利用registerClass...方法注册
- 利用重用标识符找到cell (如果没有注册类,手动创建cell)
- 给cell传递模型数据
- 1.创建一个继承UITableViewCell子类
- 非等高Cell
- xib自定义cell(重点)
- 在模型中增加一个cellHeight属性,用来存放对应cell的高度
- 在cell的模型属性set方法中调用[self layoutIfNeed]方法强制布局,然后计算出模型的cellheight属性值
- 在控制器中实现
tableView:estimatedHeightForRowAtIndexPath:方法,返回一个估计高度,比如200
- 在控制器中实现tableView:heightForRowAtIndexPath:方法,返回cell的真实高度(模型中的cellHeight属性)- storyboard自定义cell
- 代码自定义cell(frame)
- 代码自定义cell(Autolayout)
cell的调用
// 这一句返回cell估计高度,优化性能,让cell不会一次计算完所有高度,如果没有这句,cell会一次计算完所有高度
estimateHeightForRowAtIndexPath
1.estimateHeightForRowAtIndexPath 2.heightForRowAtIndexPath 3.cellForRowAtIndexPath
在自定义cell中
- (void)awakeFromNib
{
// 设置label每一行文字的最大宽度
// 为了保证计算出来的数值 跟 真正显示出来的效果 一致
self.contentLabel.preferredMaxLayoutWidth = [UIScreen mainScreen].bounds.size.width - 20;
}
// 强制布局
[self layoutIfNeeded];
// 计算cell的高度
if (self.pictureView.hidden) { // 没有配图
status.cellHeight = CGRectGetMaxY(self.contentLabel.frame) + 10;
} else { // 有配图
status.cellHeight = CGRectGetMaxY(self.pictureView.frame) + 10;
}
网友评论