【问题标题】:How to load a tableview cell using a different cell identifier than the one specified in the nib file如何使用与 nib 文件中指定的单元格标识符不同的单元格标识符加载 tableview 单元格
【发布时间】: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 中?
  • 在自己的笔尖中的自定义单元格;没有故事板。

标签: ios nib identifier tableviewcell loadnibnamed


【解决方案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 创建对象,这将有助于提高滚动性能。

    【讨论】:

      猜你喜欢
      • 2016-04-18
      • 1970-01-01
      • 2014-09-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多