【发布时间】:2025-11-22 18:20:04
【问题描述】:
当点击单元格时,我正在更改位于自定义 UITableViewCell 中的标签上的 numberOfLines 属性。但是,直到第二次点击,这才会反映在 UI 中。该单元格被配置为表格视图中的原型单元格,最初有 2 行。
有趣的是,当我在 tapped() 函数运行之前和之后打印出 numberOfLines 值时,值开始不同,然后同步 - 在第一次点击之后,我在函数运行之前看到 2 行,然后函数运行后的 0 行。但是,在随后的点击之后,我在函数之前和之后看到相同的值,这使得它看起来好像没有做任何事情,即使 UI 确实拉伸和收缩了单元格,并且下次更改了 numberOfLines 值didSelectRowAtIndexPath 函数运行。
我只看到tableView.reloadRows() 的这种行为。如果我使用tableView.reloadData() 进行完整更新,则单元格在第一次被点击时会适当地增长和折叠。但是,这感觉有点笨拙,并且不像 reloadRows() 那样很好地动画化。
TableView 实现
func tableView(_ tableView: UITableView,
didSelectRowAt indexPath: IndexPath) {
guard let cell = tableView.cellForRow(at: indexPath) as? ReviewTableViewCell
else { return }
let data = tableData[indexPath.row]
print("old number of lines: \(cell.detailLabel.numberOfLines)")
//data.isOpen is set to false initially
cell.tapped(data.isOpen)
tableData[indexPath.row].isOpen = !data.isOpen
tableView.reloadRows(at: [indexPath], with: .fade)
print("old number of lines: \(cell.detailLabel.numberOfLines)")
// tableView.reloadData()
}
自定义表格视图单元格方法
func tapped(_ isOpen: Bool) {
if !isOpen {
detailLabel.numberOfLines = 0 }
else {
detailLabel.numberOfLines = 2 }
}
如果numberOfLines 设置为0,我希望此代码在重新加载tableView.reloadRows() 后展开单元格,并在设置为2 时折叠单元格。这确实有效,但只有在点击单元格之后两次以上。这应该也适用于第一次点击。
这是一个显示问题的 gif 链接:https://imgur.com/a/qe2uAXj
这是一个示例项目,与我的应用程序中的情况类似:https://github.com/imattice/CellLabelExample
【问题讨论】: