iOS中UITableViewCell的重用问题解决方案

原创 2016年05月31日 14:45:02


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

但对于多变的自定义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]; //出列可重用的cell
    if (cell == nil) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
    }
    else
    {
        //删除cell的所有子视图


{
     NSArray *subViews = cell.contentView.subviews;


     for (UIView *view in subViews) {


        [view removeFromSuperview];
    }
}
       // while ([cell.contentView.subviews lastObject] != nil)
      //  {
     //       [(UIView*)[cell.contentView.subviews lastObject] removeFromSuperview];
    //    }
   // }

    //...其他代码
}




方法三:

- (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];
    }
    //...其他代码
}


版权声明:本文为博主原创文章,未经博主允许不得转载。

IOS 因为ipv6被拒问题解决方案

自前几天上架App Store时遇到这个问题. 2.2 Details We discovered one or more bugs in your app when reviewed on i...

iOS下的 Fixed + Input 调用键盘的时候fixed无效问题解决方案

做touchweb开发的时候,做头疼的是,电脑上面时候好的,有些手机上面也是好的,个别手机和浏览器出现问题,对于这些,只能慢慢调试,找问题。 今天说一下比较老的IOS的问题,那就是“iOS下的 ...
  • bbsyi
  • bbsyi
  • 2016年09月04日 01:09
  • 2332

iOS开发中按钮多次响应问题解决方案

iOS开发中按钮多次响应问题解决方案本文主要介绍在iOS开发中, 关于按钮多次快速点击, 响应多次的问题, 其实大多数时候我们希望按钮的响应事件只执行一次, 尽管我们快速点击按钮, 但是还是希望只响应...
  • wlaizff
  • wlaizff
  • 2016年09月07日 16:22
  • 1181

【iOS开发】AsyncSocket长连接粘包问题解决方案

工程中使用长连接来和服务器进行通讯,因此,我们的协议通过指定前两个字节为数据长度来区分数据包app这边数据有两种传输形式:1.app主动请求所需要的数据;2.app异步接收来自服务端的推送消息,也就是...

nRF iOS项目(github开源项目)编译运行相关问题解决方案

GitHub下Nordic Semiconductor的链接地址: Nordic Semiconductor的链接地址 一、nRF iOS项目 1、GitHub项目文件截图 2、Mac终端使用...

[操作系统]iOS开发之使用CocoaPods更新第三方出现“target overrides the `OTHER_LDFLAGS`……”问题解决方案

今天在自己的项目中用CocoaPods引入第三方SDWebImage的时候,出现了问题。当更新完毕后,在终端没太注意这个问题的提示,就直接使用SDWebImage了,在使用的时候一些方法的提示和头文件...

iOS开发之使用CocoaPods更新第三方出现“target overrides the `CLANG_CXX_LANGUAGE_STANDARD`……”问题解决方案

今天在自己的项目中用CocoaPods引入第三方SDWebImage的时候,出现了问题。当更新完毕后,在终端没太注意这个问题的提示,就直接使用SDWebImage了,在使用的时候一些方法的提示和头文件...

Xcode7编译遇到building for iOS simulator, but linking in object file built for OSX, for architectu问题解决方案

Xcode 7's New Linker Rules The other day I received a new error from Xcode 7. I was building an i...

XCode7和ios9的兼容和更新问题解决方案

以下内容一部分来自互联网,一部分是在使用过程中自己的总结。 神奇的苹果公司,再一次让程序员中枪。 一、xcode7 新建的项目,Foundation下默认所有http请求都被改为https请求. ...

iOS开发屏幕适配问题解决方案

屏幕适配问题共有四种解决方案:(1)根据屏幕宽高写控件frame(下策);(2)Autoresizing的使用(中策);(3)AutoLayout的使用(上策);(4)sizeClasses+Auto...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:iOS中UITableViewCell的重用问题解决方案
举报原因:
原因补充:

(最多只允许输入30个字)