我记录一下自己如何解决cell内容重叠的问题

首先,复习一下:http://blog.csdn.net/omegayy/article/details/7356823

UITableViewCell的重用,一般根据TableView同时显示在界面中的cell个数来分配内存,当然前提是,cell都是共用一个reuseIdentifier。

这样就会导致自定义cell.contentView中加载的一些subView会重叠。我是出现了这样的情况:

因为cell是重用的,cell.contentView的subView都是被保留的,所以在用reuse cell 的时候,记得,删除cell中contentView中的子视图

第一种方法:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString * reuseIndentifier = @"FindCommentCell";
    FindCommentCell * cell = [tableView dequeueReusableCellWithIdentifier:reuseIndentifier];
    if (!cell)
    {
        cell = [[FindCommentCell alloc] initWithreuseIndentifier:reuseIndentifier];
    }
    else
    {
        while ([cell.contentView.subviews lastObject] != nil)
        {
            [(UIView *)[cell.contentView.subviews lastObject] removeFromSuperview];
        }
    }
    return cell;

}

首先,通过第一种方法,我可以根据资料和我测试的结果学习如下几点:

(1) reuse 的cell 有些已经加载号一些视图的,如果想重新显示他们,有必要清楚其中的数据,或者说,重新赋新数据,所以第一种方法,其实简单粗暴,就是直接remove掉了,然后让你从新addSubView

(2)通过第一种方法,得出很多弊端,让我再一次反思了UI上,应该是创建UI和赋值数据是应当完全分开处理的

(3)让我再一次理解tableView的cell复用机制,cell其实是队列,先进的先出,然后被复用,再进入,按照单一的方向来说。

随后,我给出我自己的第二种方案

2.第二种方法:

 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
 {
     static NSString * reuseIndentifier = @"FindCommentCell";

     FindCommentCell * cell = [tableView dequeueReusableCellWithIdentifier:reuseIndentifier];

     if (!cell)
     {
         cell = [[FindCommentCell alloc] initWithreuseIndentifier:reuseIndentifier];
     }

     [cell setModel:_commentArray[indexPath.row] Height:_commentHeightArr[indexPath.row]];

     return cell;

 }

XX-ViewController

 - (void)setModel:(FindCommentUserModel *)model Height:(NSArray *)contentSize
 {
     _model   = model;
     _sizeArr = contentSize;

     [self.contentView addSubview:self.userHeader];
     [self.contentView addSubview:self.userName];
     [self.contentView addSubview:self.userTime];
     [self.contentView addSubview:self.content];

     [self setUp];
 }

FindCommentCell

 #pragma mark - Getter

 - (UIImageView *)userHeader
 {
     if (!_userHeader)
     {
         _userHeader = [[UIImageView alloc] initWithFrame:CGRectZero];
         _userHeader.image = [UIImage imageNamed:@"test.jpg"];
         _userHeader.userInteractionEnabled = YES;
     }
     return _userHeader;
 }
 ...
 ...
 ...
 ...

FindCommentCell - Getter

 - (void)setUp
 {
     _userHeader.frame = CGRectMake(FC_PADDING, FC_PADDING, FC_Header_W, FC_Header_W);
     _userName.frame   = CGRectMake(CGRectGetMaxX(_userHeader.frame)+FC_PADDING, FC_PADDING, , font_findZone_content_size - );
     _content.frame    = CGRectMake(CGRectGetMaxX(_userHeader.frame) + FC_PADDING, CGRectGetMaxY(_userName.frame) + .f, [_sizeArr[] floatValue], [_sizeArr[] floatValue]);
     _userName.text = _model.userName;
     _content.text  = _model.content;
 }

FindCommentCell - SetUp

最终两种方案的结果:

感觉是时候用storybord 或者 第三方约束了,且学且珍惜

捉襟见肘之UITableViewCell重用引发的问题的更多相关文章

  1. 你真的了解UITableViewCell重用吗?

    一:首先查看一下关于UITableViewCell重用的定义 - (nullable __kindof UITableViewCell *)dequeueReusableCellWithIdentif ...

  2. ios UITableViewCell重用问题

    在写sina 微博界面的过程中使用到了cell,那么就是在cell上添加一些控件,但是由于每条微博的内容都是不同的,所以在显示的过程中,出现了内容重叠的问题,其实就是UITableViewCell重用 ...

  3. UITableViewCell重用的问题

    UITableView中有两种重用Cell的方法: - (id)dequeueReusableCellWithIdentifier:(NSString *)identifier; - (id)dequ ...

  4. UITableViewCell重用机制

    UITableView是iOS开发中使用频率非常高的一个控件,它常被用来展示信息列表,尽管信息数据可能非常多,但UITableView消耗的资源却并不会随着展示信息的增多而变大,这都要得益于UITab ...

  5. 禁用UITableViewCell 重用机制

    有时候不想让Cell重用,怎么办勒.接下来介绍两种方法 方法一 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAt ...

  6. UITableviewCell 重用内存

    转载自:http://www.cnblogs.com/tangbinblog/p/3371545.html 重用实现分析 查看UITableView头文件,会找到NSMutableArray*  vi ...

  7. 有关UITableviewCell 重用内存 内部解析

    重用实现分析 查看UITableView头文件,会找到NSMutableArray*  visiableCells,和NSMutableDictnery* reusableTableCells两个结构 ...

  8. UITableViewCell重用导致内容混乱方案

    UITableViewCell *cell=nil; static NSString *reuse=@"cell"; if (cell==nil) { cell=[[UITable ...

  9. iOS解决cell重用问题

    在写sina 微博界面的过程中使用到了cell,那么就是在cell上添加一些控件,但是由于每条微博的内容都是不同的,所以在显示的过程中,出现了内容重叠的问题,其实就是UITableViewCell重用 ...

随机推荐

  1. 搭建emacs的go编程语言环境

    关于emacs就不说明了,直接切入主题.关于我的emacs配置,可以直接参考GitHub上的lienhua34/myemacs-conf. go-mode 安装 关于go-mode的安装,可以直接参考 ...

  2. c#自动关闭 MessageBox 弹出的窗口

    我们都知道,MessageBox弹出的窗口是模式窗口,模式窗口会自动阻塞父线程的.所以如果有以下代码: MessageBox.Show("内容',"标题"); 则只有关闭 ...

  3. HTTP Pipeline

    什么是HTTP Pipeline http管线化是一项实现了多个http请求但不需要等待响应就能够写进同一个socket的技术,仅有http1.1规范支持http管线化,1.0并不支持:采用管线化的请 ...

  4. eclipse的历史版本及下载

    有时候我们总会遇到在需要eclipse而无法及时找到的时候, 所以那些有用的链接, 是帮助我们能够及时找到我们想要版本的额最好方式 Eclipse 3.1 IO[木卫一,伊奥] 2005 http:/ ...

  5. iOS--更新cooped库

  6. C# 多线程防止卡死

    软件界面的响应特性是判断一款软件的非常重要的方面.一般来说,不管你软件功能做得有多么奇妙,如果软件有一点点死机的感觉都会让用户感到很讨厌,甚至怀疑你软件里是否藏有更大的问题. 要提高界面的响应特性,最 ...

  7. linux android真机测试

    1. 在终端运行 lsusb 会发现结果有会有如下类似记录: Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hubBus 002 ...

  8. android 获取时间

    首先,先说下java下可以正常使用的方法: import java.text.DateFormat; import java.text.SimpleDateFormat; import java.ut ...

  9. Linux 下以其他用户身份运行程序—— su、sudo、runuser

      本文综合分析了Linux系统下,如何使用runuser命令.su命令和sudo命令以其他用户身份来运行程序,以及这三个命令的运行效率比较. 一.su 命令临时切换用户身份 SU:( Switch ...

  10. android 点亮屏幕与锁定屏幕

    PowerManager pm=(PowerManager) getSystemService(Context.POWER_SERVICE); //获取电源管理器对象 PowerManager.Wak ...