UITableViewCell

12 篇文章 0 订阅

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;
}




  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值