改变高度
所以基本上,有两种方法可以做到:
第一个是实际重新加载单元格(而不是表格视图)。重新加载将调用 new heightForRow (如果您正在缓存大小,请不要忘记清除缓存),这将返回正确的新高度:
let indexPaths = [NSIndexPath(forRow: ~the rows in question~, inSection: 0)]
self.table.reloadRowsAtIndexPaths(indexPaths, withRowAnimation: .Automatic)
(但请注意,这通常涉及重新加载多行;特别是如果您选择/取消选择,则必须重新加载所有已更改的行。)
但是,如果您只想更改单元格的大小和内容本身,并且并没有真正更改数据内容......例如:
在这种情况下,无需重新加载,只需调用以下命令,这会强制 tableview 基本上执行所有动画,为此它需要新的高度,因此它会请求它:
self.table.beginUpdates()
self.table.endUpdates()
真正的解决方案
我明白你的问题是什么。您正在尝试更改单元格与实际单元格的高度 - 但您不会成功 -> 并且您不应该这样做。看,单元格就是视图,视图不应该对其数据有任何了解——视图就是呈现的内容。如果您需要任何更改,您应该通知您的控制者这样做。为此,您可以使用通知,但最好使用协议/委托。
因此,首先您在单元中创建协议,该协议将用于通知控制器发生了更改:
protocol MyCellDelegate {
func buttonTappedForCell(cell : UITableViewCell)
}
现在,您需要在包含表的视图控制器中遵守该协议:
class MyClassWithTableView : MyCellDelegate
最后,您需要在单元格中声明委托:
class MyCell {
var delegate : MyCellDelegate
}
并在单元格的配置中分配它,您可能在视图控制器中拥有它:
cell.delegate = self
这实际上是所有委托/协议的基本设置,现在,当您单击按钮时,您可以将操作转发到控制器:
@IBAction myButtonTouchUpInside() {
self.delegate.buttonTappedForCell(self)
}
完成所有这些后,按照第 1 部分进行操作。也就是说,要么reloadRowsAtIndexPaths
or a beginUpdates
/ endUpdates
如上所述配对。
希望能帮助到你!