cell简介
UITableView的每一行都是一个UITableViewCell,通过dataSource的下面方法来对每一行进行初始化:
tableView:cellForRowAtIndexPath:
其结构如下:
UITableViewCell内部有个默认的子视图contentView,contentView是UITableViewCell所显示内容的父视图,可以显示一些辅助指示视图;
辅助指示视图的作用:
用来显示一个表示动作的图标,可以通过UITableViewCell的accessoryType属性来设置不同的显示,其中默认是UITableViewCellAccessoryNone,即不显示辅助指示视图,还有一些其他值为:
另外记住,还可以通过设置其accessoryView属性来自定义辅助指示视图,如在cell最右边放一个Switch:
cell的其他属性
》backgroundColor:设置背景颜色
》backgroundView:设置背景视图,可以用UIImageView初始化,默认填充无需设置size,且其优先级要高于backgroundColor;
》selectedBackgroundView:当选中一个cell时显示的颜色
UIImageView *bgView = [[UIImageView alloc] init];
bgView.image = [UIImage imageNamed:@"XXX"];
cell.backgroundView = bgView;
bgView.backgroundColor = [UIColor XX];
UIView *selectedbgView = [[UIView alloc] init];
selectedbgView.backgroundColor = [UIColor XXX];
cell.selectedBackgroundView = selectedbgView;
子视图contentView
contentView默认有三个子视图,其中有两个是UILabel,通过UITableViewCell的textLabel和detailTextLabel属性来访问;而另一个是UIImageView,通过UITableViewCell的imageView属性来访问。
UITableViewCell还有一个重要属性UITableViewCellStyle,它用来决定使用contentView的哪些子视图,以及这些子视图在contentView中的位置,如图:
UITableView的基本性能优化
最基本的优化体现在如下方法上:
tableView:cellForRowAtIndexPath:
因为每当用户上下滚动或拉动屏幕时都会调用这一方法,由于设备内存有限,如果用UITableView显示成千上万条数据,就需要开辟这么多个UITableViewCell对象所占用的内存,可想而知很快将耗尽ios设备的内存,但我们知道苹果是一家非常注重性能的公司,这种事情是绝对不允许的,所以为了解决这一窘境,就需要对UITableViewCell对象进行复用。
Cell的复用原理:
当滚动数据列表时,部分UITableViewCell会从屏幕上消失不见,这时UITableView就会将那些消失的UITableViewCell对象放到一个对象缓存池中,等待复用;当UITableView要求数据源返回UITableViewCell对象时,数据源会首先去到缓存池中去查看,如果发现缓存池中存在闲置的UITableViewCell对象,数据源就会用新的数据来配置这个闲置的UITableViewCell对象,然后返回给UITableView重新显示到窗口中,这样我们创建的UITableViewCell对象永远只有屏幕所能容纳下的那么多个,从而避免总是创建新对象。
注意,这其中可能会出现一个问题:有时候需要自定义UITableViewCell(用一个子类继承UITableViewCell),而且每一行使用的UITableViewCell对象可能不相同,导致UITableView中会有多个不同类型的UITableViewCell对象,对应的,缓存池中也会有多个不同类型的UITableViewCell对象,因此当我们想要在缓存池中拿出一个UITableViewCell对象待复用时就不能随随便便拿了,因为这样会导致拿到的UITableViewCell对象类型与当前屏幕需要显示的类型不同。
解决办法:UITableViewCell中有一个NSString *reuseIdentifier属性,可以在初始化UITableViewCell对象的时候传入一个特定的字符串标识来设置这一属性(通常用UITableViewCell的类名来标识);当UITableView要求数据源返回UITableViewCell对象时,首先通过一个字符串标识到缓存池中查找对应类型的UITableViewCell对象,如果存在就复用,反之就传入这个字符串标识来初始化一个UITableViewCell对象。
code:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
//定义一个cell的标识
static NSString *ID = @"MYcell";
//从缓存池中取出cell
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:ID];
if(cell == nil){
cell =[ [UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:ID];
}
//设置cell的属性
...
return cell;
}