[英]How to update self-sizing tableview's height?
您正在朝正确的方向思考。 但是,您的方法存在两个问题:
reloadData
重新加载整个表视图,并且不对更改进行动画处理。 UITableView
视图层次结构时,向上移动超级视图链肯定会中断。 他们之前已经做过,所以他们可能会再做一次。 要解决第一个问题,您应该调用reloadRowsAtIndexPaths:withRowAnimation:
这只会重新加载您在indexPath数组中指定的单元格。 因此,您将仅包含单元格的indexPath的数组传递给它。
第二个问题有点棘手,因为UITableViewCell
没有对其UITableView
引用(并且不应引用)。 因此,它无法直接告诉UITableView
重新加载单元格。
您可以给每个单元格一个闭合值,只要高度改变,它就应该执行。 因此,您只需在自定义单元格中添加一个闭合属性:
class YourCustomTableViewCell: UITableViewCell {
var resizeClosure: (() -> Void)?
...
当您使单元出队时,可以在UITableViewControllerDataSource
设置此闭包:
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell:UITableViewCell = tableView.dequeueReusableCellWithIdentifier("YourCustomCellIdentifier", forIndexPath: indexPath)
if let customCell = cell as? YourCustomTableViewCell {
customCell.resizeClosure = { [weak cell, weak tableView] in
if let currentIndexPath = tableView?.indexPathForCell(cell!) {
tableView?.reloadRowsAtIndexPaths([currentIndexPath], withRowAnimation: .Automatic)
}
}
}
return cell
}
只要确保将tableView
添加到闭包的捕获列表中,就可以避免强引用周期。 这是通过将[weak tableView]
添加到闭包来完成的。
然后,当单元格更改其高度时,您只需执行关闭操作,单元格将被重新加载:
func someFunctionThatChangesTheHeight() {
// change the height
resizeClosure?()
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.