关于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所需要的高度。




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

相关文章推荐

xib创建Cell时重用数据混乱问题解决方案

写这篇文章是因为在项目中遇到了这个问题,,所以拿下来和大家一起分享,...
  • JSON_6
  • JSON_6
  • 2017年04月12日 17:55
  • 557

关于iOS UITableView 数据源数组加载完成之后,滑动时出现cell为空的问题解决笔记

今天中午,一朋友遇到一个问题,说遇到UITableView 加载数据

关于cell重用时偶尔重叠的小问题

这个星期五的工作中遇到了cell重用引起的小问题,问题基本描述如:重用cell时,有可能导致cell的图片或者一些文字信息的重叠,即新加载的信息会叠加在重用的表格上面。基于这样一个情况,相信大部分人都...

关于 UITableView 中 cell 自适应高度的问题

最近在做一个app,内容主要是 一个 table view 的 cell 中有一张宽度一定高度不一定的图片和不一样高度的文字。每次从服务器楼数据会返回图片的 URL 地址和文字等内容,但只有图片下载完...

iOS UITableView-FDTemplateLayoutCell框架 cell重叠 高度返回0.5问题解决

针对需要动态改变cell高度的需求, 相对来说使用UITableView-FDTemplateLayoutCell框架来解决还是比较便捷的, 他可以支持AutoLayout和 frame layout...

UITavleView自定义Cell和重用机制常见错误分析

系统的Cell提供了几种样式,但是在一些情况下,依然需要自定义cell才能满足业务需求。当同时采用自定义cell和cell重用机制的时候,容易出现以下两种问题。 先来看第一种错误代码- (UITab...

cell重用注意事项(对于经常出现重用错误的程序猿吗,可参考一下)

注意事项: 1,在cellForRowAtIndexpath里如果wei'dui

Qt qextserialport类 发送数据大于127 发生错误既最高位置零的问题

近日项目使用Qt用到串口,使用了第三方库qextserialport,开始进行一切顺利,后来调试时出现问题,发送串口数据时,大于127的数接收会发生错误。 例如:发送0xe1,接收到的却是0x61,接...

串口接收数据错误0D变0A问题

在调试串口软件过程中遇到一个烦人的问题,就是s

关于Nib加载cell重用的问题

今天在完成一个功能点的时候遇到一个小问题,如题是,在tableview中有多textField表单进行修改操作,在tableview滚动出屏幕时,没保存的textField数据会被刷新为原始指。经过排...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:关于UITablewViewCell 中cell高度可变,重用时数据发生错误问题
举报原因:
原因补充:

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