iOS 关于UITableViewCell复用机制的理解

先说一句题外话,Apple官方建议不要在scrollview中嵌套scrollview。tableview也是scrollview的一种,不到万不得已时不要将它嵌到scrollview中。我们回到正题,UITableView是很高效的,与它的cell复用机制密不可分。cell复用指的是什么呢?通俗地说一下。假设我们的tableview中有10个cell,窗口只容得下前5个,每个cell都是一样的,复用id也一样。从初始位置开始慢镜头,把cell前上滑动一点点,此时第一个cell的一部分消失了,第五个cell露出了一部分,这时第一个cell并没有进入到复用池,池子是空的,第五个cell自然也就不能在复用池中找到可复用的cell,第五个cell执行了如下代码:

[objc]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cacheCellId];  
  2. if (!cell) {  
  3.     cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellId];  
  4. }  

通过调试跟踪可以看到程序走到了if里面去。

当第五个cell完全显示出来,第一个cell也已经完全退出了窗口,这时第一个cell被放入到复用池。我们继续向上滑动,第六个cell将显示出来,它也要走上面的那段代码,但是它不会进入到if里面去,因为第一个cell已经在复用池中了,第六个cell可以复用第一个cell,而不需重新创建对象。

有时为了解决一些cell内容无法刷新的问题,我省去了cell复用的常规写法,每次都是建立一个新的cell,即去掉上面那段代码中if的部分。

[objc]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. else if (3 == indexPath.section) {  
  2.         //这里没有使用cell复用机制,为了解决登录按钮无法刷新title的问题  
  3.         UITableViewCell *cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:nil];  
  4.           
  5.         //登录按钮  
  6.         float btnH = 39;  
  7.         float btnW = ScreenWidth - 40;  
  8.         UIButton *btnForLogin = [[UIButton alloc] initWithFrame:CGRectMake(00, btnW, btnH)];  
  9.         btnForLogin.layer.cornerRadius = 3.f;  
  10.         btnForLogin.center = cell.center;  
  11.         btnForLogin.backgroundColor = UIColorFromRGB_hex(0xbe8300);  
  12.         [btnForLogin setTitleColor:UIColorFromRGB_hex(0xf8f8f8) forState:UIControlStateNormal];  
  13.         [btnForLogin.titleLabel setFont:[UIFont fontWithName:@"黑体-简" size:16]];  
  14.         [btnForLogin setTitle:_btnForLoginTitle forState:UIControlStateNormal];  
  15.         [btnForLogin addTarget:self action:@selector(loginButtonClicked) forControlEvents:UIControlEventTouchUpInside];  
  16.           
  17.         [cell addSubview:btnForLogin];  
  18.         return cell;  
  19.     }  

这个cell中装个一个登录按钮,用户登录状态下按钮显示“退出登录”,用户未登录状态下按钮显示“登录”,在按钮响应事件处理方法中对按钮的标题_btnForLoginTitle进行变换,然后执行 [ _tableView reloadData ]; 以使这个cell中按钮文字相应改变。结果是如果复用cell则按钮文字不能及时改变,每次创建新的cell则可解决问题,于是便投机取巧了。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值