关于UITablewViewCell 中cell高度可变,重用时数据发生错误问题

原创 2016年08月29日 19:08:53

        在我们使用UITablewViewCell时,在很多情况下,我们不仅需要固定高度的cell来进行数据和界面的布局,有时候根据数据的不同,我们还需要有高度不同的Cell来进行数据的存放和界面的布局。 



比如这样一个由换行Label来决定cell高度的UITablewViewCell, 如果出现在滑动过程中出现数据错乱的现象,我的解决办法是,在UITablewViewCell调用它的代理方法之前,这时候我们已经拿到了cell上面所需要存放的数据,这时候我们就可以根据这些数据来计算每一条数据所对应的cell的高度。这时候我们就可以提前控制cell的高度,这时候无论UITablewViewCell调用代理方法的顺序是怎么样的,我们都能够保证每一个cell所对应的数据是正确的。这时候我们需要创建一个为cell存放数据源的Model.

具体实现代码如下:

在所创建的Model中要存在一个高度的属性:

@property (nonatomic, strong) NSString *testStr;


@property (nonatomic, assign) float height;


- (instancetype) initWithString:(NSString *) text;

- (instancetype) initWithString:(NSString *) text

{

    if (self = [super init]) {

        self.testStr = text;

        //获取字符串进行换行之后的高度

        CGSize titleSize = [CommonClass stringSizeWithStr:text maxSize:CGSizeMake(SCREENWIDTH - 30, MAXFLOAT) strFont:[UIFont systemFontOfSize:14.0] lineSpace:0];

        self.height = titleSize.height + 30;

    }

    return self;

}


在控制器中先对model进行传值,然后正常调用相应的代理方法:

 TestModel * model0 = [[TestModel alloc] initWithString:@"苹果周五提交给监管部门的文件显示,苹果CEO蒂姆·库克本周出售了价值3600万美元的苹果股份。苹果周五提交给监管部门的文件显示苹果周五提交给监管部门的文件显示"];

    TestModel * model1 = [[TestModel alloc] initWithString:@"苹果周五提交给监管部门的文件显示,苹果CEO蒂姆·库克本周出售了价值3600万美元的苹果股份。苹果周五提交给监管部门的文件显示苹果周五提交给监管部门的文件显示"];

    TestModel * model2 = [[TestModel alloc] initWithString:@"苹果周五提交给监管部门的文件显示,苹果CEO蒂姆·库克本周出售了价值3600万美元的苹果股份。苹果周五提交给监管部门的文件显示苹果周五提交给监管部门的文件显示"];

    TestModel * model3 = [[TestModel alloc] initWithString:@"苹果周五提交给监管部门的文件显示,苹果CEO蒂姆·库克本周出售了价值3600万美元的苹果股份。苹果周五提交给监管部门的文件显示苹果周五提交给监管部门的文件显示"];

    TestModel * model4 = [[TestModel alloc] initWithString:@"苹果周五提交给的文件显示"];

    TestModel * model5 = [[TestModel alloc] initWithString:@"苹果周五提交给监管苹果周五提交给监管部门的文件显示,苹果CEO蒂姆·库克本周出售了价值3600万美元的苹果股份。苹果周五提交给监管部门的文件显示苹果周五提交给监管部门的文件显示部门的文件显示,苹果CEO蒂姆·库克本周出售了价值3600万美元的苹果股份。苹果周五提交给监管部门的文件显示苹果周五提交给监管部门的文件显示"];

    TestModel * model6 = [[TestModel alloc] initWithString:@"苹果周五提交给监管部门的文件显示,苹果CEO蒂姆·库克本周出售了价值3600万美元的苹果股份。苹果周五提交给监管部门的文件显示苹果周五提交给监管部门的文件显示"];

    TestModel * model7 = [[TestModel alloc] initWithString:@"苹果周五提交姆·库克本周出售了价值3600万美元的苹果股份。苹果周五提交给监管部门的文件显示苹果周五提交给监管部门的文件显示"];

    TestModel * model8 = [[TestModel alloc] initWithString:@"苹果周五提交给"];

    TestModel * model9 = [[TestModel alloc] initWithString:@"苹果周五提监管部门的文件显示,苹果CEO蒂姆·库克本周出售了价值3600万美元的苹果股份。苹果周五提交给监管部门的文件显示苹果周五提交给监管部门的文件显示"];

    

    _dataSourceArr = @[model0, model1,model2, model3,model4, model5,model6, model7,model8, model9,model0,model1,model2,model4];


#pragma mark - UITableViewDelegate

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

{

    TestModel *model = [_dataSourceArr objectAtIndex:indexPath.row];

    static NSString *cellString = @"inder";

    TestCell *cell = [tableView dequeueReusableCellWithIdentifier:cellString];

    if(!cell)

    {

        cell = [[TestCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellString];

    }

    [cell setCellData:model];

    return cell;

}


- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section

{

    return self.dataSourceArr.count;

}


- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath

{

    TestModel *model = [_dataSourceArr objectAtIndex:indexPath.row];

    return model.height;

}


在cell中同样是用model中所获取的高度进行设置:

- (instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier

{

    if(self = [super initWithStyle:style reuseIdentifier:reuseIdentifier])

    {

        _testLabel = [[UILabel alloc] init];

        _testLabel.backgroundColor = [UIColor orangeColor];

        _testLabel.font = [UIFont systemFontOfSize:14.0];

        _testLabel.textAlignment = NSTextAlignmentLeft;

        _testLabel.numberOfLines = 0;

        [self.contentView addSubview:_testLabel];

    }

    return self;

}


- (void)setCellData:(TestModel *)model;

{

    _testLabel.text = model.testStr;

    [_testLabel mas_remakeConstraints:^(MASConstraintMaker *make) {

        make.left.equalTo(15);

        make.right.equalTo(-15);

        make.top.equalTo(0);

        make.height.equalTo(model.height - 30);

    }];

}


这只是一种最近刚摸索出来的一种感觉比较合乎逻辑的方法,如果有错误的地方希望大家见谅并能提出意见进行修改!总之一句话在获取数据的同时就计算好cell所需要的高度。




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

UILabel如何使用sizeToFit进行宽高适配 和 sizeThatFits 以及实现总是顶端显示text的需求

sizeToFit方法,是UIView的一个系统方法,苹果文档如下描述: - (void)sizeToFit Description Resizes an...
  • binglan520
  • binglan520
  • 2017年06月30日 16:23
  • 616

ios开发点滴-UILable 根据文字内容进行大小设置 sizeThatFits和sizeToFit

1.定义一个UILable  [objc] view plaincopy self.view.backgroundColor =[UIColor whiteColor];...
  • u010013695
  • u010013695
  • 2015年02月03日 10:55
  • 2494

UIButton实现上图下字,左图右字等组合形式以及sizeToFit的简单理解

UI需求中很会遇到很多文字和图片混排的效果,暴力做法就是图片用Image,文字用Label分开来实现,然后组合, 但是我们有UIButton,可以根据他的imageEdgeInsets和titleEd...
  • Deft_MKJing
  • Deft_MKJing
  • 2016年11月04日 18:11
  • 1880

sizeToFit()使用心得

很多的初学者,包括我在内,当初在学习的时候,特别纠结什么时候用这个sizeToFit()。 下面我就来分享一下我的一些使用心得。 一.我们先来看看官方文档对sizeToFit()的声明:(Swi...
  • adrianoll
  • adrianoll
  • 2015年11月29日 05:50
  • 217

关于 控件抖动以及 互换位置的说写

前段时间由于公司需求,恰好需要做一个CollectionView的Item长按后抖动并且可移动效果。但由于一些原因,当时并没有来得及去处理,所以一直心有遗憾。目前市场上此功能并不少见,而且在githu...
  • u011864662
  • u011864662
  • 2016年11月09日 12:02
  • 160

UILabel如何使用sizeToFit正确适配行数

sizeToFit方法,是UIView的一个系统方法,这个方法,会自动调整view的bounds,使用最小的、符合需求的区域大小。 猜想这个方法用来计算label的宽高会很方便,但是一开始未达到效果,...
  • qq_25357887
  • qq_25357887
  • 2015年01月15日 21:00
  • 50

UILabel如何使用sizeToFit进行宽高适配

sizeToFit方法,是UIView的一个系统方法,苹果文档如下描述: - (void)sizeToFit Description Resizes an...
  • imanapple
  • imanapple
  • 2015年01月15日 21:51
  • 2116

iOS开发之解决WebView自适应内容高度

这段时间写的项目中,有涉及到根据后端上传的表单内容,然后在移动端将内容排版重新展示的功能点,所以小小的写一下解决办法。首先如果直接进行内容展示,或者进行sizeToFit的操作,那么可能会造成图片超过...
  • hbblzjy
  • hbblzjy
  • 2017年06月21日 10:14
  • 426

MWPhotoBrowser 属性详解 和代理解释

原文:http://blog.csdn.net/hsf_study/article/details/51783989 --------0.MWPhoto简单属性解释---------------- M...
  • qq_22157341
  • qq_22157341
  • 2017年03月28日 14:52
  • 841

ios开发点滴-UILable 根据文字内容进行大小设置 sizeThatFits和sizeToFit

1.定义一个UILable  self.view.backgroundColor =[UIColor whiteColor]; NSString *str=@"目前支持以下站...
  • ys344155411
  • ys344155411
  • 2014年03月12日 11:03
  • 21668
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:关于UITablewViewCell 中cell高度可变,重用时数据发生错误问题
举报原因:
原因补充:

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