当我更改行数时,具有 rowHeight UITableViewAutomaticDImension 的 UITableView 不会更新

Posted

技术标签:

【中文标题】当我更改行数时,具有 rowHeight UITableViewAutomaticDImension 的 UITableView 不会更新【英文标题】:UITableView with rowHeight UITableViewAutomaticDImension does not update when I change the number of lines 【发布时间】:2017-04-05 12:29:11 【问题描述】:

我有一个UITableViewCell,底部有一个描述标签,如下所示:

点击描述标签可在30 之间切换numberOfLines

- (void)awakeFromNib 
    [super awakeFromNib];
    [self setupView];


-(void) setupView


    UITapGestureRecognizer * gestureRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(toggleNumberOfLines)];
    self.jobDescriptionLabel.userInteractionEnabled = YES;
    [self.jobDescriptionLabel addGestureRecognizer:gestureRecognizer];


- (void) toggleNumberOfLines 
    if(self.jobDescriptionLabel.numberOfLines != 0)
        self.jobDescriptionLabel.numberOfLines = 0;
    else
        self.jobDescriptionLabel.numberOfLines = kNumberOfLines;
    
    [self.jobDescriptionLabel sizeToFit];
    [self layoutIfNeeded];

当我点击标签时,行数会发生变化,但单元格不会扩展以适应新的行数。我该如何解决?

折叠(默认):

扩展:

【问题讨论】:

仍然无法理解您的实际问题。问题出在标签或展开的 tableView 上?? UITableViewAutomaticDimension 根据单元格的内容自动计算单元格的高度。就我而言,我正在更新标签的高度,但表格视图不会更新单元格的高度。如何让 tableview 更新单元格的高度 您需要强制重新加载表格。首先将调用HeightOfRow 方法,然后调用cellForRow。因此,当调用 HeightOfRow 方法时,请确保您有一个新的标签高度。请添加您为此完成的代码工作。 【参考方案1】:

如果您的约束设置正确,您不需要重新加载数据 --- 不需要重新加载整个表,甚至不需要重新加载受影响的行。

最好的方法是将委托函数添加回您的 tableview 控制器,然后背靠背调用这些行:

tableView.beginUpdates()
tablebleView.endUpdates()

这将告诉自动布局重新计算行高。

编辑:检查我的答案 - 其中包括一个演示项目的链接 - 在这里:Expand UILabel inside UITableView with "more" button like Instagram

【讨论】:

太棒了!简直太棒了!非常感谢【参考方案2】:

当单元格布置它的子视图时,表格视图实际上并没有任何方式知道发生了什么变化。您必须手动告诉表视图重新计算。

您可能想要重新加载表格视图,或者至少要重新加载发生更改的单元格。

查看reloadData 以重新加载整个表视图,或者查看reloadRowsAtIndexPaths: 如果您只想重新加载Apple reference docs 中的特定索引。

【讨论】:

这种方法的问题是,当我调用reloadRowsAtIndexPaths 时,它会重新创建单元格。这意味着我需要将状态 jobDescriptionExpanded 存储在我的 UIViewController 中,并在创建单元格时传递它。虽然这可行,但它并不完全优雅 为什么不使用UITableViewCell的选中状态来决定jobDescriptionExpanded的值呢?不幸的是,让UITableView 更新其单元格高度的唯一方法是重新加载单元格。因此,无论您认为自己的解决方案多么“不雅”,您都必须这样做。【参考方案3】:

您可以在 heightForRowAtindexPath: 中更新 tableview 单元格高度。 调用 reloadRowsAtIndexPath 方法更新 UITableView 的单行。

self.dataTableView.beginUpdates()
self.dataTableView.reloadRows(at: [IndexPath(row: 0, section: 0)], with: UITableViewRowAnimation.automatic)
self.dataTableView.endUpdates()

【讨论】:

以上是关于当我更改行数时,具有 rowHeight UITableViewAutomaticDImension 的 UITableView 不会更新的主要内容,如果未能解决你的问题,请参考以下文章

ObservableCollection.CollectionChanged 未触发

当我为 UITableView 设置 rowHeight 时,单元格的高度不应该也改变吗?

iPhone + UITableView + 行高

不同的 SELECTs 子句更改行数(具有相同的 WHERE 条件)

使用 rowHeight 的 ui-grid 行高:'auto'

当数据集的列具有不同的行数时合并它们