iOS 关于UITableViewCell复用机制的理解
2014-12-26 23:45
239 查看
先说一句题外话,Apple官方建议不要在scrollview中嵌套scrollview。tableview也是scrollview的一种,不到万不得已时不要将它嵌到scrollview中。我们回到正题,UITableView是很高效的,与它的cell复用机制密不可分。cell复用指的是什么呢?通俗地说一下。假设我们的tableview中有10个cell,窗口只容得下前5个,每个cell都是一样的,复用id也一样。从初始位置开始慢镜头,把cell前上滑动一点点,此时第一个cell的一部分消失了,第五个cell露出了一部分,这时第一个cell并没有进入到复用池,池子是空的,第五个cell自然也就不能在复用池中找到可复用的cell,第五个cell执行了如下代码:
通过调试跟踪可以看到程序走到了if里面去。
当第五个cell完全显示出来,第一个cell也已经完全退出了窗口,这时第一个cell被放入到复用池。我们继续向上滑动,第六个cell将显示出来,它也要走上面的那段代码,但是它不会进入到if里面去,因为第一个cell已经在复用池中了,第六个cell可以复用第一个cell,而不需重新创建对象。
有时为了解决一些cell内容无法刷新的问题,我省去了cell复用的常规写法,每次都是建立一个新的cell,即去掉上面那段代码中if的部分。
这个cell中装个一个登录按钮,用户登录状态下按钮显示“退出登录”,用户未登录状态下按钮显示“登录”,在按钮响应事件处理方法中对按钮的标题_btnForLoginTitle进行变换,然后执行[_tableViewreloadData];以使这个cell中按钮文字相应改变。结果是如果复用cell则按钮文字不能及时改变,每次创建新的cell则可解决问题,于是便投机取巧了。
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cacheCellId]; if (!cell) { cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellId]; }
通过调试跟踪可以看到程序走到了if里面去。
当第五个cell完全显示出来,第一个cell也已经完全退出了窗口,这时第一个cell被放入到复用池。我们继续向上滑动,第六个cell将显示出来,它也要走上面的那段代码,但是它不会进入到if里面去,因为第一个cell已经在复用池中了,第六个cell可以复用第一个cell,而不需重新创建对象。
有时为了解决一些cell内容无法刷新的问题,我省去了cell复用的常规写法,每次都是建立一个新的cell,即去掉上面那段代码中if的部分。
else if (3 == indexPath.section) { //这里没有使用cell复用机制,为了解决登录按钮无法刷新title的问题 UITableViewCell *cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:nil]; //登录按钮 float btnH = 39; float btnW = ScreenWidth - 40; UIButton *btnForLogin = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, btnW, btnH)]; btnForLogin.layer.cornerRadius = 3.f; btnForLogin.center = cell.center; btnForLogin.backgroundColor = UIColorFromRGB_hex(0xbe8300); [btnForLogin setTitleColor:UIColorFromRGB_hex(0xf8f8f8) forState:UIControlStateNormal]; [btnForLogin.titleLabel setFont:[UIFont fontWithName:@"黑体-简" size:16]]; [btnForLogin setTitle:_btnForLoginTitle forState:UIControlStateNormal]; [btnForLogin addTarget:self action:@selector(loginButtonClicked) forControlEvents:UIControlEventTouchUpInside]; [cell addSubview:btnForLogin]; return cell; }
这个cell中装个一个登录按钮,用户登录状态下按钮显示“退出登录”,用户未登录状态下按钮显示“登录”,在按钮响应事件处理方法中对按钮的标题_btnForLoginTitle进行变换,然后执行[_tableViewreloadData];以使这个cell中按钮文字相应改变。结果是如果复用cell则按钮文字不能及时改变,每次创建新的cell则可解决问题,于是便投机取巧了。
相关文章推荐
- iOS 关于UITableViewCell复用机制的理解
- 关于 去除UITableViewCell复用机制 的几种方法
- iOS关于UITableViewCell的重用机制
- iOS 类别与继承的区别以及复用机制的理解
- [IOS]轻松理解UITableViewCell的重用机制
- 关于 去除UITableViewCell复用机制 的几种方法
- iOS : UITableViewCell复用之自己理解
- 关于iOS中ARC机制的理解
- 关于ios签名机制的理解
- [IOS]关于segue原理机制的理解
- iOS UITableViewCell重用机制理解之初级剑侠篇(欢迎提建议和分享遇到的问题)
- 关于反射机制的理解和Assembly的学习(反射机制二)
- UItableViewCell的复用机制原理
- IOS 学习笔记--关于对Block的理解
- 关于反射机制(反射机制的理解一)
- UItableViewCell的复用机制,原理解答
- 关于iOS Delegate的个人理解
- 如何才能系统的学习 iOS 开发,理解一些规则和深层次的机制原理?
- UITableViewCell重用机制理解
- 关于delegate 与 protocol 的理解 iOS