改变高度
所以基本上,有两种方法可以做到:
第一个是实际重新加载单元格(不是表格视图)。重新加载将调用新的 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 或 beginUpdates / endUpdates 对,如上所述。
希望对你有帮助!