IOS开发实训第八周周报
总结:
根据小组分工,本周我学习的知识点有:对于个人页面的用户收藏列表和浏览列表,进行优化,包括:
(1)如何进行UITableViewCell的格式自定义
(2)UITableViewCell自适应地高度
(3)学习UITableViewCell的缓存机制
学习知识点归纳
1. 自定义UITableViewCell
自定义UITableViewCell有两种形式:纯代码定义与xib格式定义
(1)纯代码定义
创建UITableViewCell的子类,作为自定义Cell,并重写初始化函数:initWithStyle:withReuseableCellIdentifier,完成Cell内部子控件的声明与加载;
- (instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
{
self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
if(self)
{
[self setMyView];
}
return self;
}
在使用之前,需要为这个Cell注册一个CellIdentifier,以便于系统缓存重用的cell:
[ tableView registerClass:[FooterCell Class] forCellReuseIdentifier:CellIdentifier];
当我们需要获取特定row的cell时,重写cellForRowAtIndexPath方法:先检查是否有可重用的cell,若有,通过dequeueReusableCellWithIdentifier方法获取;若无,通过UITableViewCell的initWithStyle方式创建;
FooterCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];
(2)xib定义
在创建自定义UITableViewCell的头文件和源文件时,标明继承自UITableViewCell类,并同时创建xib文件,通过拖动控件和建立关联的形式,在xib文件中设计好cell的格式,并在属性栏直接填写CellIdentifier进行注册;
2. UITableViewCell的重用机制
UITableView的每一行都是一个cell,通过dataSource的tableView:cellForRowAtIndexPath方法来初始化每⼀行,当某行出现在用户视野范围内时,初始化这一cell,假如用户在短时间内来回滚动,就会重复创建大量的cell;
为了解决这一问题,UITableViewCell引入了重用机制;
重用机制原理:当滚动列表时,部分UITableViewCell会移出窗口,UITableView会将窗口外的UITableViewCell放入一个对象池中,等待重用。当UITableView要求dataSource返回 UITableViewCell时,dataSource会先查看这个对象池,如果池中有未使用的 UITableViewCell,dataSource则会用新的数据来配置这个UITableViewCell,然后返回给 UITableView,重新显示到窗口中,从而避免创建新对象 。这样可以让创建的cell的数量维持在很低的水平,如果一个窗口中只能显示5个cell,那么cell重用之后,只需要创建6个cell就够了;
cellIdentifier的作用:在我们的用户收藏列表中,cell的格式是多样的,例如,若新闻列表中有图片,我们需要使用一个带图片的cell,若新闻数据中没有图片,那么需要使用一个无图片的cell,为了避免重用过程中,数据配置到错误的cell,我们需要给每种类型的cell定义一个标识符,那么在重用时,就可以通过标识符来找到对应的cell进行重新配置;
// 先去缓存池中查找是否有满足条件的Cell
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:identifier];
// 如果缓存池中没有符合条件的cell,就自己创建一个Cell
if (cell == nil) {
// 创建Cell, 并且设置一个唯一的标记
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:identifier];
NSLog(@"创建一个新的Cell");
}
// 给cell设置数据
NJHero *hero = self.heros[indexPath.row];
cell.textLabel.text = hero.name;
cell.detailTextLabel.text = hero.intro;
cell.imageView.image = [UIImage imageNamed:hero.icon];
3. UITableViewCell高度自适应
self.tableView.rowHeight = UITableViewAutomaticDimension;
self.tableView.estimatedRowHeight = 80.;
cell内若是放置了textView之类的控件,需要设置其不可滚动;
后续任务
通过本周的学习,我对UITableView这一IOS开发中常用的控件有了更多的了解,学会了自定义一个UITableView,以及它的重用机制的原理,和自适应高度的方式,经过本周的工作,个人部分的页面设计已经完成,下周任务是实现各个页面之间的跳转、返回逻辑;
来源:CSDN
作者:夜里惊羽
链接:https://blog.csdn.net/Cait_/article/details/93198241