如何使用与 nib 文件中指定的单元格标识符不同的单元格标识符加载 tableview 单元格

Posted

技术标签:

【中文标题】如何使用与 nib 文件中指定的单元格标识符不同的单元格标识符加载 tableview 单元格【英文标题】:How to load a tableview cell using a different cell identifier than the one specified in the nib file 【发布时间】:2012-05-11 01:37:05 【问题描述】:

// 实际问题 在使用与 nib 中指定的单元格标识符不同的单元格标识符加载 nib 文件(tableviewcell)时,我需要帮助。

// 我在做什么的背景 我有一个自定义 UITableViewCell,标签很少,图像很少,按钮也很少。所有这些都放在一个 nib 文件中。表格视图单元格的内容需要根据某些条件动态更改,即如果未显示横向按钮;如果标签中没有要显示的内容,则不显示标签等。左侧的相邻标签/视图应扩展以填充缺少的标签/按钮的空间。

我能够让它工作。我这样做的方式是在cellForRowAtIndexPath I - 使用removeFromSuperView 和 by 删除不需要显示的视图 - 调整frame 并调用setNeedsDisplay 以获得需要调整的视图。

我使用 nib 文件中提到的相同单元格标识符来使单元格出列。如果返回的单元格为零,那么我使用loadNibNamed:withOwner:options 来加载笔尖。但是,我担心这会在来回滚动时导致问题,因为当条件不满足时,被重用的单元格可能没有显示内容所需的视图,因为它们可能已经被删除。

为了解决这个问题,我计划针对不同条件使用不同的单元格标识符,从而触发单元格的不同外观。或者,我也在考虑只隐藏视图并将相邻视图扩展到隐藏视图。这样我就不需要处理不同的单元格标识符。

编辑2: 我隐藏和调整相邻视图框架的替代方法满足了我的需要。

但是我仍然想找到我上面描述的实际问题的答案。

// 潜在的解决方案 我想知道是否可以通过loadNibNamed 函数的options 参数将单元格标识符传递给笔尖加载代码。这可能吗?如果你们能提供一个示例代码来实现这一点,那就太棒了。

感谢您的宝贵时间。

【问题讨论】:

这是一个带有原型单元的故事板,还是您的自定义单元在其自己的 nib 中? 在自己的笔尖中的自定义单元格;没有故事板。 【参考方案1】:

您需要做的就是在 nib 中创建多个具有不同标识符的单元格,然后使用适当的标识符调用 dequeueReusableCellWithIdentifier 以获得对适当类型单元格的引用。

【讨论】:

感谢您的回复;我想了想,但后来不想走那条路,因为这意味着我创建了几乎相同单元格的 n 个副本,但略有不同。这样做的坏处是对视图进行轻微调整会变得很麻烦,因为我必须在多个副本中进行更改。我现在有一个用于 iPhone 和 iPad 的单独笔尖,当我需要对两个版本中都可用的视图进行小改动时,这本身就让我抓狂。 好的,但您的问题是关于将单元格标识符传递给 nib 加载代码。这就是它的作用...... 对不起,如果不是很明显,我的问题更多是关于将单元格标识符传递给 loadNibNamed 函数,以便我可以动态创建具有不同标识符的单元格,而不必复制单元格并创建多个副本每次加载 nib 文件时的单元格对象。 与其把它们都放在不同的笔尖里,不如把它们放在一个笔尖里。在您调用 dequeueReusableCellWithIdentifier: 之前它实际上不会加载它们,因此当您加载多个 nib 时实际上会产生额外的开销。【参考方案2】:

我对这个解决方案不是很自豪,可能会出现问题,但我会尝试在从 nib 加载后设置单元格的标识符。

- (id)initWithReuseIdentifier:(NSString *)reuseIdentifier

    self = [[NSBundle mainBundle] loadNibNamed:@"MyCell" owner:nil options:nil].lastObject;
    [self setValue:reuseIdentifier forKeyPath:@"_reuseIdentifier"];

    // ...

    return self;

【讨论】:

【参考方案3】:

您无法更改 nib 中指定的单元重用标识符。 Reference。您正在谈论的选项字典也不会为您执行此操作。这些选项与 nib 中的代理对象相关。

与其删除子视图,不如简单地隐藏它们。您可以使用 IBOutletCollections 使批量隐藏/取消隐藏更容易。如果需要,您可以在 prepareForReuse 中将单元格重置为其默认状态。

同时查看 UINib - 这可以比 loadNibNamed 更快地从 nob 创建对象,这将有助于提高滚动性能。

【讨论】:

以上是关于如何使用与 nib 文件中指定的单元格标识符不同的单元格标识符加载 tableview 单元格的主要内容,如果未能解决你的问题,请参考以下文章

如何在表格视图中加载不同的自定义单元格

访问,从单个 nib 获取对多个视图的引用

如何使用 .vbs 文件保存具有在电子表格中指定的名称的文件

无法将具有标识符 TodoItemRow 的单元格出列 - 必须为标识符注册一个 nib 或一个类,或者连接情节提要中的原型单元格

如何连接故事板中的原型单元?

如何限制标题单元格的宽度