【发布时间】:2011-06-16 22:18:33
【问题描述】:
这个问题我看过很多次了,但令人惊讶的是,我没有看到一个一致的答案,所以我自己试试看:
如果您有一个包含您自己的自定义 UITableViewCells 的 tableview,其中包含 UITextViews 和 UILabels,其高度必须在运行时确定,您应该如何确定 heightForRowAtIndexPath 中每一行的高度?
最明显的第一个想法是通过计算然后将 cellForRowAtIndexPath 内的单元格内每个视图的高度求和来计算每个单元格的高度,并存储最终的总高度以供以后检索。
这将不起作用,因为 cellForRowAtIndexPath 在 heightForRowAtIndexPath 之后被调用。
我唯一能想到的就是在 viewDidLoad 中进行所有计算,然后创建所有 UITableViewCells,计算单元格高度并将其存储在 UITableViewCell 子类中的自定义字段中,然后将每个单元格放在 NSMutableDictionary 中indexPath 作为键,然后简单地使用 cellForRowAtIndexPath 和 heightForRowAtIndexPath 中的 indexPath 从字典中检索单元格,返回自定义高度值或单元格对象本身。
这种方法似乎是错误的,因为它没有使用 dequeueReusableCellWithIdentifier,相反,我会一次将所有单元格加载到我的控制器中的字典中,并且委托方法只会从字典。
我没有看到任何其他方法可以做到这一点。这是一个坏主意 - 如果是这样,正确的方法是什么?
【问题讨论】:
-
两个委托方法之间的共同点恰好是
NSIndexPath参数,看来您必须仅根据该参数进行计算。也许将您的视图分配到heightForRowAtIndexPath:,然后将它们放在cellForRowAtIndexPath:? -
嗯,这听起来有点像我描述的那样,虽然我想因为我会一次创建所有应该在 viewDidLoad 中完成的单元格,以确保它只完成一次。
-
我也遇到了同样的问题。这很奇怪,因为这似乎是 API 中的一个巨大疏忽。但是假设 Apple API 开发人员比我远聪明,我想知道这样做的正确方法是什么?
-
这两件事分开的原因是你不能在不知道每个项目的高度的情况下在列表中滚动(具体来说,绘制滚动条是不可能的),但是对于创建每个单元格的长列表是贵得让人望而却步。
标签: ios uitableview reloaddata heightforrowatindexpath