gpt4 book ai didi

iOS8 改变动态单元格高度 "now",重新内部单元格内容

转载 作者:可可西里 更新时间:2023-11-01 04:38:07 25 4
gpt4 key购买 nike

这是一个动态单元格

enter image description here

注意 - 在示例中,文本不是数据驱动的。它只是单元格本地的一些文本(例如,考虑帮助文本)。在运行时,使用实际位于单元格内的按钮将 UILabel 的 .text 从一个词更改为多行。 iOS 完全调整单元格和表格的大小....

...但仅当单元格滚动到屏幕外,然后再次滚动时

如何提醒 TableView “现在”重新计算所有内容?


(请注意,此问题仅适用于 iOS8+、Xcode7+、动态单元格高度的自动布局。)

最佳答案

改变高度

基本上,有两种方法可以做到:

第一个是实际重新加载单元格(而不是表格 View )。重新加载将调用新的 heightForRow(如果您正在缓存尺寸,请不要忘记清除缓存),这将返回正确的新高度:

 let indexPaths = [NSIndexPath(forRow: ~the rows in question~, inSection: 0)]
self.table.reloadRowsAtIndexPaths(indexPaths, withRowAnimation: .Automatic)

(但是请注意,这通常涉及重新加载不止一行;特别是如果您选择/取消选择,则必须重新加载所有已更改的行。)

但是,如果您只想更改单元格的大小和内容本身,并没有真正更改数据内容……例如:

  • 您点击了某个按钮并将单元格中的新本地文本分配给导出(可能是帮助文本):

  • 您只更改了单元格的布局。例如,您将字体变大,或更改文本 block 的边距,从而更改文本 block 的高度,因此整个单元格的高度确实发生了变化:

在这种情况下,无需重新加载,只需调用以下命令,这会强制 tableview 基本上执行所有动画,为此它需要新的高度,因此它请求它:

 self.table.beginUpdates()
self.table.endUpdates()

真正的解决方案

我知道你的问题是什么。您正在尝试从实际单元格更改单元格的高度 - 但您不会成功 -> 而且您不应该这样做。看,单元格是 View , View 不应该对其数据有任何想法 - View 就是呈现的内容。如果您需要任何更改,您应该通知您的控制者这样做。为此,您可以使用通知,但最好使用协议(protocol)/委托(delegate)。

所以首先你在你的单元格中创建协议(protocol),它将用于通知 Controller ,有一个变化:

 protocol MyCellDelegate {

func buttonTappedForCell(cell : UITableViewCell)
}

现在,您需要在包含表的 View Controller 中遵守该协议(protocol):

 class MyClassWithTableView : MyCellDelegate

最后,您需要在单元格中声明委托(delegate):

 class MyCell {
var delegate : MyCellDelegate
}

并在你可能在 View Controller 中拥有的单元配置中分配它:

 cell.delegate = self

这实际上是所有委托(delegate)/协议(protocol)的基本设置,现在,当您单击按钮时,您可以将操作转发给您的 Controller :

 @IBAction myButtonTouchUpInside() {

self.delegate.buttonTappedForCell(self)
}

完成所有这些之后,按照第 1 部分进行操作。也就是说,reloadRowsAtIndexPathsbeginUpdates/endUpdates 对,如所解释的以上。

希望对您有所帮助!

关于iOS8 改变动态单元格高度 "now",重新内部单元格内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32673562/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com