全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

UITableView中Cell重用机制导致内容重复的解决方法

UITableView继承自UIScrollview,是苹果为我们封装好的一个基于scroll的控件。上面主要是一个个的UITableViewCell,可以让UITableViewCell响应一些点击事件,也可以在UITableViewCell中加入UITextField或者UITextView等子视图,使得可以在cell上进行文字编辑。

UITableView中的cell可以有很多,一般会通过重用cell来达到节省内存的目的:通过为每个cell指定一个重用标识符(reuseIdentifier),即指定了单元格的种类,当cell滚出屏幕时,会将滚出屏幕的单元格放入重用的queue中,当某个未在屏幕上的单元格要显示的时候,就从这个queue中取出单元格进行重用。

但对于多变的自定义cell,有时这种重用机制会出错。比如,当一个cell含有一个UITextField的子类并被放在重用queue中以待重用,这时如果一个未包含任何子视图的cell要显示在屏幕上,就会取出并使用这个重用的cell显示在无任何子视图的cell中,这时候就会出错。

解决方法:

方法1 将获得cell的方法从- (UITableViewCell*)dequeueReusableCellWithIdentifier:(NSString*)identifier 换为-(UITableViewCell *)cellForRowAtIndexPath:(NSIndexPath *)indexPath

重用机制调用的就是dequeueReusableCellWithIdentifier这个方法,方法的意思就是“出列可重用的cell”,因而只要将它换为cellForRowAtIndexPath(只从要更新的cell的那一行取出cell),就可以不使用重用机制,因而问题就可以得到解决,虽然可能会浪费一些空间。

示例代码:

[plain]
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
  static NSString *CellIdentifier = @"Cell";
  // UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
  //改为以下的方法
  UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath]; 
  //根据indexPath准确地取出一行,而不是从cell重用队列中取出
  if (cell == nil) {
    cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
  }
   //...其他代码               
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
  static NSString *CellIdentifier = @"Cell";
  // UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
  //改为以下的方法
  UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath]; 
  //根据indexPath准确地取出一行,而不是从cell重用队列中取出
  if (cell == nil) {
    cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
  }
   //...其他代码               
}

方法2 通过为每个cell指定不同的重用标识符(reuseIdentifier)来解决。
重用机制是根据相同的标识符来重用cell的,标识符不同的cell不能彼此重用。于是我们将每个cell的标识符都设置为不同,就可以避免不同cell重用的问题了。

示例代码:

[plain]
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
  
  NSString *CellIdentifier = [NSString stringWithFormat:@"Cell%d%d", [indexPath section], [indexPath row]];

  //以indexPath来唯一确定cell
  UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; //出列可重用的cell
  if (cell == nil) {
    cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
  }
  //...其他代码
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
 
  NSString *CellIdentifier = [NSString stringWithFormat:@"Cell%d%d", [indexPath section], [indexPath row]];

  //以indexPath来唯一确定cell
  UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; //出列可重用的cell
  if (cell == nil) {
    cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
  }
  //...其他代码
}

方法3 删除重用cell的所有子视图

这个方法是通过删除重用的cell的所有子视图,从而得到一个没有特殊格式的cell,供其他cell重用。

示例代码:

[plain]
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
  static NSString *CellIdentifier = @"Cell";
  UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; //出列可重用的cell
  if (cell == nil) {
    cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
  }
  else
  {
    //删除cell的所有子视图
    while ([cell.contentView.subviews lastObject] != nil)
    {
      [(UIView*)[cell.contentView.subviews lastObject] removeFromSuperview];
    }
  }
  //...其他代码
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


# UITableView  # Cell  # 重用机制  # 内容重复  # iOS中UITableView Cell实现自定义单选功能  # IOS UITableViewCell详解及按钮点击事件处理实例  # 详解ios中自定义cell  # 自定义UITableViewCell  # IOS UITableView和UITableViewCell的几种样式详细介绍  # iOS App开发中使用及自定义UITableViewCell的教程  # 详解iOS开发中UITableview cell 顶部空白的多种设置方法  # 全面解析iOS应用中自定义UITableViewCell的方法  # iOS App中UITableView左滑出现删除按钮及其cell的重用  # iOS中使用UItableviewcell实现团购和微博界面的示例  # 单元格  # 就会  # 是从  # 而不  # 就可以  # 滚出  # 是一个  # 放在  # 子类  # 有很多  # 屏幕上  # 就可  # 自定义  # 将它  # 无任何  # 设置为  # 会将  # 解决方法  # 使用这个  # 大家多多 


相关文章: 建站10G流量真的够用吗?如何应对访问高峰?  网站制作公司广州有几家,广州尚艺美发学校网站是多少?  制作网站的公司有哪些,做一个公司网站要多少钱?  如何用景安虚拟主机手机版绑定域名建站?  如何用腾讯建站主机快速创建免费网站?  如何快速完成中国万网建站详细流程?  太原网站制作公司有哪些,网约车营运证查询官网?  大同网页,大同瑞慈医院官网?  网站制作哪家好,cc、.co、.cm哪个域名更适合做网站?  如何确认建站备案号应放置的具体位置?  郑州企业网站制作公司,郑州招聘网站有哪些?  建站之星如何开启自定义404页面避免用户流失?  制作表格网站有哪些,线上表格怎么弄?  如何在Windows环境下新建FTP站点并设置权限?  婚礼视频制作网站,学习*后期制作的网站有哪些?  如何确保FTP站点访问权限与数据传输安全?  如何通过建站之星自助学习解决操作问题?  宝塔建站助手安装配置与建站模板使用全流程解析  建站主机服务器选购指南:轻量应用与VPS配置解析  如何挑选最适合建站的高性能VPS主机?  如何用VPS主机快速搭建个人网站?  定制建站如何定义?其核心优势是什么?  黑客如何通过漏洞一步步攻陷网站服务器?  专业商城网站制作公司有哪些,pi商城官网是哪个?  建站三合一如何选?哪家性价比更高?  青岛网站建设如何选择本地服务器?  完全自定义免费建站平台:主题模板在线生成一站式服务  建站之星如何助力网站排名飙升?揭秘高效技巧  如何在云虚拟主机上快速搭建个人网站?  专业的网站制作设计是什么,如何制作一个企业网站,建设网站的基本步骤有哪些?  制作网站的软件免费下载,免费制作app哪个平台好?  如何解决VPS建站LNMP环境配置常见问题?  制作假网页,招聘网的薪资待遇,会有靠谱的吗?一面试又各种折扣?  重庆网站制作公司哪家好,重庆中考招生办官方网站?  整人网站在线制作软件,整蛊网站退不出去必须要打我是白痴才能出去?  电商网站制作公司有哪些,1688网是什么意思?  如何彻底卸载建站之星软件?  公司门户网站制作流程,华为官网怎么做?  如何在香港服务器上快速搭建免备案网站?  如何在阿里云域名上完成建站全流程?  网站制作公司哪里好做,成都网站制作公司哪家做得比较好,更正规?  如何零成本快速生成个人自助网站?  如何制作算命网站,怎么注册算命网站?  网站制作知乎推荐,想做自己的网站用什么工具比较好?  免费制作统计图的网站有哪些,如何看待现如今年轻人买房难的情况?  高性能网站服务器配置指南:安全稳定与高效建站核心方案  成都网站制作报价公司,成都工业用气开户费用?  学校免费自助建站系统:智能生成+拖拽设计+多端适配  在线教育网站制作平台,山西立德教育官网?  php能控制zigbee模块吗_php通过串口与cc2530 zigbee通信【介绍】 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。