你的位置:首页 > 软件开发 > 操作系统 > 关于UITableViewCell的循环利用

关于UITableViewCell的循环利用

发布时间:2016-07-27 22:00:17
UITableViewCell的重复利用机制有效地节省内存开销和提高程序性能。 1 原理tableView拥有一个缓存池,存放未在使用(没有显示在界面)的cell。tableView有一行cell要显示时先从缓存池里找,没有则创建,有一行cell隐藏不需要显示时就放到缓存池。 ...

关于UITableViewCell的循环利用

UITableViewCell的重复利用机制有效地节省内存开销和提高程序性能。 

1 原理

tableView拥有一个缓存池,存放未在使用(没有显示在界面)的cell。

tableView有一行cell要显示时先从缓存池里找,没有则创建,有一行cell隐藏不需要显示时就放到缓存池。

2 图解循环利用代码

//cellForRow 代码

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{

 

  static NSString *ID = @"test"; // cell循环利用标识为”test”

 

  //从当前tableView对应的缓存池里找标识为”test”的cell;

  UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:ID];

 

  //如果缓存池里没有,即cell为空,创建新的cell

  if(!cell){

   cell = [[UITableViewCell alloc]init];

  }

   return cell;

}

关于UITableViewCell的循环利用

关于UITableViewCell的循环利用 

 

3 循环利用问题 

3.1 问题1

这里引入一个数据模型 LSUser(用户模型),

属性: name(NSString, 名字), vip(BOOL, 是否会员)

 

 

关于UITableViewCell的循环利用

图3-1

 

//cellForRow方法中设置数据

//设置用户名称

cell.textLabel.text = user.name;

 

//如果用户是vip,设置用户名称颜色为红色

if(user.vip){

    cell.textLabel.textColor = [UIColor redColor];

}

 

由于吴八不是会员,跳过if 语句,吴八名称颜色应为黑色,但实际上却保留着陈七cell0设置的会员颜色红色。这是循环利用一个简单的问题所在。

假设if 语句中添加了对称的设置语句,这个问题就不会出现。

if(user.vip){

    cell.textLabel.textColor = [UIColor redColor];

}else{

    cell.textLabel.textColor = [UIColor blackColor];

}

 

UITableViewCell的循环利用要求我们对称地设置视图的外观和状态。

实际上这个事例的循环利用问题可以认为出在cell.textLabel.textColor默认颜色为黑色上,假设需求是非会员名称颜色为蓝色,于是设置数据时:

cell.textLabel.textColor = user.vip ? [UIColor redColor]: [UIColor blueColor];

认真思考下。。。

 

3.2 问题2

这里有个需求:点击了某一行cell, 当前cell用户名称颜色改为紫色, 其余为原来的黑色

 

可能你会这么做:

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{

   UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];

    cell.textLabel.textColor = [UIColor purpleColor];

}

-(void)tableView:(UITableView *)tableView didDeselectRowAtIndexPath:(NSIndexPath *)indexPath{

   UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];

 cell.textLabel.textColor = [UIColor blackColor];

}

暂时看来确实符合了需求,点击的当前行名称颜色为紫色,其余为黑色

但是,当你拖动tableView, 当前行隐藏,随意拖动,愕然地发现某一行名称颜色为紫色,再回到原先点击的当前行,名称颜色却为黑色而不是紫色。

 

这也是循环利用的问题。接下来解决这个问题。

当一行cell将要显示时,会调用tableView的数据源方法-tableView:cellForRowAtIndexPath;

循环利用影响影响cell显示,不会影响原始数据,该方法中进行了数据设置的步骤,利用它介绍两种解决方案:

 

1)  循环利用不会影响indexPath,indexPaht是唯一的。

 

  首先拥有一个NSIndexPath类型的selectedIndexPath属性,用于纪录当前选中行,在didSelectRowAtIndexPath方法中进行赋值。 

  然后在-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath方法中,

 

  //设置数据

  //取出对应行的数据模型

  LSUser *user = self.users[indexpath.row];

 

  //设置用户名称

  cell.textLabel.text = user.name;

 

  //根据是否是选中行设置名称颜色

  if(self.selectedIndexPath == indexPath){

 

海外公司注册、海外银行开户、跨境平台代入驻、VAT、EPR等知识和在线办理:https://www.xlkjsw.com

原标题:关于UITableViewCell的循环利用

关键词:ie

ie
*特别声明:以上内容来自于网络收集,著作权属原作者所有,如有侵权,请联系我们: admin#shaoqun.com (#换成@)。