从笔尖创建 UITableViewCell,动态单元格高度
Posted
技术标签:
【中文标题】从笔尖创建 UITableViewCell,动态单元格高度【英文标题】:Create UITableViewCell from nib, dynamic cell height 【发布时间】:2012-07-24 11:17:17 【问题描述】:我的大部分 UITableView 单元都是从笔尖创建的。在这个特定的项目中,有很多,它们的大小不一。
现在我在设计时在笔尖中指定单元格高度,我希望这是我指定此值的唯一位置。
但是,tableView:heightForRowAtIndexPath:, 在我的笔尖加载到 cellForRowAtIndexPath 之前被调用,所以我没有这个值。
这“有点”烦人,因为我必须在代码中再次指定我的身高。
我可以预先加载一个笔尖来获得这个值。有没有人有任何聪明的模式来管理这个,或者你只是忍受它?
【问题讨论】:
看看这里的示例代码 - ***.com/a/18503213/2086991 【参考方案1】:好吧,我可以想出三种方法来让这件事变得更容易一些:
1) 将高度编码为笔尖名称 - myNib.47.xib
2) 创建一个可变字典,并在 viewDidLoad 处创建reuseIdentifier 作为键和nsnumber 作为对象的条目。
3) 2. 的变体。在 viewDidLoad 中,使用以下方法将 UINib 对象与重用标识符关联:
cellNib = [UINib nibWithNibName:@"MyCellNibXYZ" bundle:nil];
在可变字典中。当你需要一个单元格时,你调用:
UINib *nib = [mutableDictioanary objectForKey:...];
MyCell *cell = [[cellNib instantiateWithOwner:nil options:nil] objectAtIndex:0];
然后,您可以在需要高度时实例化一个单元格,然后将其扔掉。实例化比每次访问时去文件系统读取文件要快得多。
【讨论】:
是的,选项 3 看起来不错。缓存 UINib 会起作用,因为无论如何我都必须在某个时候加载它。 嗯,使用 UINib 节省的时间可以忽略不计。我在某处读过一篇文章,该文章显示了该人节省的时间,即使对于大桌子也可以忽略不计。本来可以是有爱的可可。不记得了。但至少不会下降。还有内存使用/性能权衡。【参考方案2】:你写过:现在我在设计时在笔尖中指定单元格高度,我希望这是我指定此值的唯一位置。
如果你真的想只在 IB
中保持高度,你应该在你的-init:
或-loadView
方法中从Nib
创建一个每个单元格的实例,你可以使用这些实例来确定单元格的最终高度是多少。因此,您将在 - tableView:heightForRowAtIndexPath:
方法中使用这些预先初始化的实例知道每个单元格的确切高度。
不太优雅,但它正在工作。
【讨论】:
是的,因为在这种情况下预加载是唯一的选择。以上是关于从笔尖创建 UITableViewCell,动态单元格高度的主要内容,如果未能解决你的问题,请参考以下文章
从笔尖初始化自定义 UITableViewCell 没有 dequeueReusableCellWithIdentifier
从笔尖加载的 UITableViewCell 未更新(缓存?)