当我更改行数时,具有 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
,底部有一个描述标签,如下所示:
点击描述标签可在3
和0
之间切换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 时,单元格的高度不应该也改变吗?
不同的 SELECTs 子句更改行数(具有相同的 WHERE 条件)