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 循环引用问题解决方案

一:循环引用        循环引用:是指两个对象相互retain对方,通过OBJC的release是无法销毁这两个对象的。更严重的是,如果几个对象间接相互引用:比如A • 对象a创建并引用到了对...

RSA加密算法在iOS9下的问题解决方案

之前写的可运行的RSA加密解密算法,升级到iOS9之后,到SecItemAdd就crash掉了。 打了断点发现SecKeyRef竟然为空,几个月前可不是这样的,只能是iOS9更新了什么。看了一下官方...

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

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

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

屏幕适配问题共有四种解决方案:(1)根据屏幕宽高写控件frame(下策);(2)Autoresizing的使用(中策);(3)AutoLayout的使用(上策);(4)sizeClasses+Auto...

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

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

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

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

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...

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

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

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

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

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

iOS开发中按钮多次响应问题解决方案本文主要介绍在iOS开发中, 关于按钮多次快速点击, 响应多次的问题, 其实大多数时候我们希望按钮的响应事件只执行一次, 尽管我们快速点击按钮, 但是还是希望只响应...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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