我有一个带有stackView的tableViewCell。我想把它变成一个可折叠的细胞。我可以在tableView:cellForRowAt:
中成功设置第二个标签的隐藏状态但是,如果我更改隐藏状态以响应单元格的点击,则可见性不会在屏幕上更改。
UIView.animate(withDuration: 0.25) { [unowned self] in
self.disclaimers.isHidden = !cellItem.isExpanded
}
正如标签.isHidden属性一样,正确切换了cellItem.isExpanded属性。在屏幕上没有变化。
我知道这已经在主线程上了,因为tableView:didSelectRowAt:在主线程上被调用。但为了掩盖自己,我尝试使用DispatchQueue.main.async {}调用而不是UIView.animate来包装该行。没有变化。
有什么想法吗?
如果您愿意,可以使用完整项目:https://github.com/AaronBratcher/TableViewTester
问题在DisclaimersCell.swift中。第33行
答案 0 :(得分:1)
夫妻问题......
除了.dequeueReusableCell
之外,您不应该在cellForRowAt
之外的任何地方致电。你可以在TableViewController.swift
- >中执行此操作didSelectRowAt
...创建单元格的 new 实例,不表格中的现有实例。将您的guard
行更改为:
guard var cellItem = helper.cellForRowAtIndexPath(indexPath) as? TableViewExpandableCellItem
, let cell = tableView.cellForRow(at: indexPath) as? TableViewExpandableCell
, cellItem.shouldExpand
else { return }
这样,tableView.cellForRow(at: indexPath)
将返回现有的单元格。
接下来,动画.isHidden
的设置不会为您提供所需的动画。
在DisclaimersCell.swift
- > toggleExpansion()
,更改:
UIView.animate(withDuration: 0.25) { [unowned self] in
self.disclaimers.isHidden = !cellItem.isExpanded
}
简单地说:
self.disclaimers.isHidden = !cellItem.isExpanded
然后,在TableViewController didSelectRowAt
函数中:
cellItem.isExpanded = !cellItem.isExpanded
cell.toggleExpansion(tableViewCellItem: cellItem)
tableView.beginUpdates()
tableView.endUpdates()
这将告诉单元格隐藏/显示标签,将.beginUpdates()
与endUpdates()
配对将触发重新计算表格中的行高,并为重绘设置动画。