从笔尖创建 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

从笔尖初始化自定义 UITableViewCell 没有 dequeueReusableCellWithIdentifier

从笔尖加载的 UITableViewCell 未更新(缓存?)

来自 NIB 的可扩展自定义 UITableViewCell

在单元格中,如何定位和调整从具有自动布局的笔尖创建的视图?

使用笔尖的 UITableViewCell 背景颜色