循环利用
- tableView显示单组数据的时候,总是显示很多的数据,当然tableView不可能一次加载这么多的数据,那样会浪费很多的内存空间。感觉在手机看来,内存的空间,总是比处理器的资源更加珍贵。这时,就需要用到性能优化了。
- tableView自身会有一个缓存,将cell绑定标识符来进行识别,并实现内存空间的循环利用。当然一开始缓存中并没有这样的cell,所以需要初始创建若干cell,当此cell不再视野中时,就会被抛弃到缓存中,然后被赋予另一个数据,仍旧是同样的内存空间,并显示出来。
- 当cell滚动非常快的时候,cell的覆盖并非是按照顺序进行的。
- dequeueReusableCellWithIdentifier:,去缓存池中查找可循环利用的cell,如果没有的话,就需要自己去创建了。在storyboard设置有identifier的cell,不需要自己创建,默认的回去storyboard里面找有没有这个标识符的cell。
- reigsterClass
//objc
// 注册某个标识对应的cell类型
[self.tableView registerClass:[UITableViewCell class] forCellReuseIdentifier:ID];
-
几个常用的方法
- select
- deselect
- willSelect
- willDeselect
- heightForRow
- viewForHeader
- heightForHeader
tableViewDelegate 协议继承于 scrollViewDelegate,可以自动继承了方法scrollViewDidScroll
cell
-
cell的属性
- selectionStyle 选中的样式
- selectedBackgroundView 选中的背景色视图
- backgroundColor / backgroundView 默认的背景色
- accessoryType / accessoryView 设置指示器
-
定义等高的cell
- xib生成cell
- registerNib
- storyboard生成cell
- 代码生成cell,使用frame来约束,当父控件的frame发生改变的时候,自动调用layoutSubViews: 来对子控件自动布局
- 代码生成cell,使用autoLayout自动布局,不需要放在layoutSubviews:方法中
- 技巧:通过设置背景色,来查看约束是否正确,或者用层级调试工具degug
- xib生成cell
-
定义非等高的cell
- 当cell的宽度随着UILable中字数以及UIImageView的有无,来随时调整cell的高度
- heightForRowAtIndexPath: 方法的调用是在cellForRowAtIndexPath:之前。等程序确定了所有行的高度之后,才会调用返回cell的函数。
- 在heightForRowAtIndexPath:中调用cellForRowAtIndexPath:。返回cell的函数是拿出显示出来的cell。当cell还没有创建的时候,返回来的是nil。
那么cell的高度到底如何来确定呢
- 使用estimatedHeightForRowAtIndexPath:方法,当程序知道了估计的高度之后,先调用cellForRowAtIndexPath:,然后再调用heightForRowAtIndexPath:。
- 由于UITableViewController不知道创建cell内部的子控件细节;在cell的自定义代码中,返回height函数,让外界来调用。
- 强制布局 [cell layoutIfNeeded],这个很重要。一般情况下,控件的属性布局在tableView显示之前的那一刻去计算,但是要提前获取这些cell的高度,就需要强制去提醒tableView现在就去计算。
- KVC 键值编码
- 方法:setValuesForKeysWithDictionary
- 不是按照顺序匹配,是找到与字典的key同属性名的value,并设置
- number -> bool 根据类型会有自动转化,有点智能
tips
- static 修饰局部变量的时候,初始化一次,内存中只有一份。防止一个对象被连续的创建被销毁,但是设置成全局变量又有着代码管理的复杂性弊端。
- 定义一条线: separator分割线 将UIView的高度设置成1即可。