iOS - UITableView中Cell重用机制导致Cell内容出错的解决办法
"UITableView" iOS开发中重量级的控件之一;在日常开发中我们大多数会选择自定Cell来满足自己开发中的需求, 但是有些时候Cell也是可以不自定义的(比如某一个简单的页面,只需要展示一些简单的信息);但是当页面大于屏幕显示的范围的时候, 滑动UITableView的时候,Cell上的内容会出现混乱或者错误的现象,经过反复的查找问题应该是出现在UITableViewCell的重用机制上;那么下面我们就来说一下解决这种问题的几种办法,以及最好的解决办法:
(一)使用系统的Cell,简单的Cell重用机制我们会这样去写:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString *cellIdentifier = @"cellID"; UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier]; if (!cell) {
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:cellIdentifier];
} // 说明: 要测试Cell内容是否错乱, 要将每行Cell显示的内容不同, 才能看出来
cell.textLabel.text = @"Cell显示内容";
cell.detailTextLabel.text = @"Cell辅助显示内容"; return cell;
}
这样写虽然达到了Cell的重用, 但是会出现我们要讨论的话题(滑动UITableView出现Cell内容混乱的情况),那么下面我们就来说一下避免Cell内容出现混乱的写法;
(二)使用系统的Cell,避免Cell内容出现混乱的写法:
(1)方法一:
①将获得Cell的方法:- (UITableViewCell *)dequeueReusableCellWithIdentifier:(NSString *)identifier; 换为:- (UITableViewCell *)cellForRowAtIndexPath:(NSIndexPath *)indexPath;
②解决了Cell内容混乱的现象,但是没有能够达到Cell的重用机制的原理;因为cellForRowAtIndexPath(只从要更新的cell的那一行取出cell),不使用重用机制,因而问题就可以得到解决,但是会浪费一些空间(真机测试比其他方法略显卡顿);
③示例代码:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString *cellIdentifier = @"cellID"; // UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];
// 将上面的方法换成(根据indexPath准确地取出一行, 而不是从cell重用队列中取出, 方法如下:)
UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath]; if (!cell) {
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:cellIdentifier];
} // 说明: 要测试Cell内容是否错乱, 要将每行Cell显示的内容不同, 才能看出来
cell.textLabel.text = @"Cell显示内容";
cell.detailTextLabel.text = @"Cell辅助显示内容"; return cell;
}
(2)方法二:
①通过为每个cell指定不同的重用标识符(reuseIdentifier)来解决;
②重用机制是根据相同的标识符来重用Cell的,标识符不同的Cell不能彼此重用;我们将每个Cell的标识符都设置为不同,就可以避免不同Cell重用的问题了;
③示例代码:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
// static NSString *cellIdentifier = @"cellID";
// 将上面的方法换成(以indexPath来唯一确定Cell, 方法如下:)
NSString *cellIdentifier = [NSString stringWithFormat:@"Cell%zd%zd", [indexPath section], [indexPath row]]; UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier]; if (!cell) {
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:cellIdentifier];
} // 说明: 要测试Cell内容是否错乱, 要将每行Cell显示的内容不同, 才能看出来
cell.textLabel.text = @"Cell显示内容";
cell.detailTextLabel.text = @"Cell辅助显示内容"; return cell;
}
(3)方法三:
①通过删除重用的Cell的所有子视图,从而得到一个没有特殊格式的Cell,供其他Cell重用;
②示例代码:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString *cellIdentifier = @"cellID"; UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier]; if (!cell) {
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:cellIdentifier];
} else {
// 删除Cell的所有子视图
while ([cell.contentView.subviews lastObject] != nil) {
[(UIView*)[cell.contentView.subviews lastObject] removeFromSuperview];
}
} // 说明: 要测试Cell内容是否错乱, 要将每行Cell显示的内容不同, 才能看出来
cell.textLabel.text = @"Cell显示内容";
cell.detailTextLabel.text = @"Cell辅助显示内容"; return cell;
}
(以上便是对相关知识的相关介绍和理解,还希望大家相互补充共同进步)
iOS - UITableView中Cell重用机制导致Cell内容出错的解决办法的更多相关文章
- ios UITableView中Cell重用机制导致内容重复解决方法
UITableView继承自UIScrollview,是苹果为我们封装好的一个基于scroll的控件.上面主要是一个个的 UITableViewCell,可以让UITableViewCell响应一些点 ...
- 解决UITableView中Cell重用机制导致内容出错的方法总结
UITableView继承自UIScrollview,是苹果为我们封装好的一个基于scroll的控件.上面主要是一个个的 UITableViewCell,可以让UITableViewCell响应一些点 ...
- 远程控制Windows2003下安装Pcanywhere导致Awgina.dll出错的解决办法
远程控制的时候出现的问题引用 症状启动计算机时,"欢迎使用 Windows"登录屏幕不出现.您还可能会看到与下面的某条信息类似的错误信息: ? 一个最近安装的程序使欢迎屏幕和快速用 ...
- 虚拟机中安装Ubuntu后,安装VMwareTools出错的解决办法:Not enough free space to extract VMwareTools
1.选择安装VMwareTools 2.将加载后的Vmware Tools中的*.tar.gz文件,复制到桌面后提取,否则会报错: 3.然后进入提取后的文件下,运行终端 sudo ./vmware-i ...
- iOS之UITableView中的cell因为重用机制导致新的cell的数据出现重复或者错乱
UITableView中的cell可以有很多,一般会通过重用cell来达到节省内存的目的:通过为每个cell指定一个重用标识符(reuseIdentifier),即指定了单元格的种类,当cell滚 ...
- 测试SDWebImage淡入淡出效果在UITableView中的重用显示问题
测试SDWebImage淡入淡出效果在UITableView中的重用显示问题 这个是在上一篇教程的基础上所添加的测试环节! 效果图(从效果图中看是没有任何重用问题的): 源码: ImageCell.h ...
- spring boot:方法中使用try...catch导致@Transactional事务无效的解决(spring boot 2.3.4)
一,方法中使用try...catch导致@Transactional事务无效的解决方法 1,问题的描述: 如果一个方法添加了@Transactional注解声明事务, 而方法内又使用了try catc ...
- IOS的Safari浏览器中,点击事件失效的原理及解决办法
这里做了事件委托,简单区分一下[目标元素]和[代理元素],为后续论述理解做铺垫. [目标元素]:实际希望点击的元素,可以是任意标签. [代理元素]:代替[目标元素]触发点击事件的元素,有可能是目标元素 ...
- es6 Object.assign ECMAScript 6 笔记(六) ECMAScript 6 笔记(一) react入门——慕课网笔记 jquery中动态新增的元素节点无法触发事件解决办法 响应式图像 弹窗细节 微信浏览器——返回操作 Float 的那些事 Flex布局 HTML5 data-* 自定义属性 参数传递的四种形式
es6 Object.assign 目录 一.基本用法 二.用途 1. 为对象添加属性 2. 为对象添加方法 3. 克隆对象 4. 合并多个对象 5. 为属性指定默认值 三.浏览器支持 ES6 O ...
随机推荐
- 在 Linux 打造属于自己的 Vim
Linux 系统中很多东西都是以脚本代码.配置文件的形式存在,使用 Linux 系统时,需经常对这些文件进行编辑.很显然,如果没有文本编辑器,江湖之路寸步难行. 我的选择是 Vim.Vim 是 Lin ...
- atitit 商业项目常用模块技术知识点 v3 qc29
atitit 商业项目常用模块技术知识点 v3 qc29 条码二维码barcodebarcode 条码二维码qrcodeqrcode 条码二维码dm码生成与识别 条码二维码pdf147码 条码二维码z ...
- Atitit java onvif 开源类库 getProfiles getStreamUri
Atitit java onvif 开源类库 getProfiles getStreamUri 1. ONVIF Java Library by Milgo1 1.1. https://github. ...
- Java关键字:static
通常,当创建类时,就是在描述那个类的外观和行为.只有用new创建类的对象时,才分配数据存储空间,方法才能被调用.但往往我们会有下面两种需求: 1.我想要这样一个存储空间:不管创建多少对象,无论是不创建 ...
- MongoDB 安全和访问权限控制
MongoDB的访问控制能够有效保证数据库的安全,访问控制是指绑定Application监听的IP地址,设置监听端口,使用账户和密码登录 一,访问控制的参数 1,绑定IP地址 mongod 参数:-- ...
- Git异常:Cannot delete the branch 'test1' which you are currently on
GitHub实战系列汇总:http://www.cnblogs.com/dunitian/p/5038719.html ———————————————————————————————————————— ...
- ASP.NET MVC5+EF6+EasyUI 后台管理系统(45)-工作流设计-设计步骤
系列目录 步骤设计很重要,特别是规则的选择. 我这里分为几个规则 1.按自行选择(在起草时候自行选审批人,比较灵活) 2.按上级(无需指定,当时需要知道用户的上司是谁,可以在职位管理设置,或者在用户表 ...
- Python:认识模块
一.了解 Python 模块: -- 什么是函数: 函数是实现一项或多项功能的一段程序 模块是实现一类功能的程序块,是包含函数和其他语句的脚本文件,以".py"为后缀名 默认,C: ...
- 《你不知道的JavaScript》整理(一)——作用域、提升与闭包
最近在读一本进阶的JavaScript的书<你不知道的JavaScript(上卷)>,里面分析了很多基础性的概念. 可以更全面深入的理解JavaScript深层面的知识点. 一.函数作用域 ...
- ASP.NET Core 中文文档 第二章 指南(8) 使用 dotnet watch 开发 ASP.NET Core 应用程序
原文:Developing ASP.NET Core applications using dotnet watch 作者:Victor Hurdugaci 翻译:谢炀(Kiler) 校对:刘怡(Al ...