【问题标题】:Objective-c Removing a reuseIdentifier from a UITableViewCellObjective-c 从 UITableViewCell 中删除重用标识符
【发布时间】:2014-09-30 21:59:14
【问题描述】:

我有一个自定义 UITableViewCell,其中包含从服务器获取的数据。当数据进入时,我设置了单元格的重用标识符。一切正常,直到我进行下拉刷新并获取新/更新的数据。来自服务器的标识符是相同的,但数据可能不同(在这种情况下这是预期的结果)。发生这种情况时,我需要重新创建单元格,并保持相同的重用标识符。我知道不设置重用标识符是解决此问题的一种方法,但这是一个非常糟糕的主意,会损害性能。

我在这里查看了很多涉及重用标识符的问题,但没有一个能够回答我的问题。

感谢您提供的任何见解!

【问题讨论】:

  • 我认为你不明白它应该如何工作。重用标识符标识初始化单元格的特定方式(例如,设置背景颜色、添加标签等),因此,如果您使用该标识符将单元格出列,则无需重做初始化。
  • 对于一个简单的表,所有行的格式都相同,一个单独的reuseIdentifier 值用于所有内容。
  • 我知道reuseIdentifier 标识了一种识别单元格的特定方式。就我而言,每个单元格都是根据我从服务器获得的信息唯一创建的。所以当我滚动到底部并备份时,我确实得到了正确的单元格,因为设置了重用标识符,我不需要重新初始化它。当我进行下拉刷新时,单元格“x”的数据可能会发生变化,并且我的单元格设置方式,我需要重新创建单元格。
  • reuseIdentifier 标识单元格的格式。您需要自己定义什么构成“格式”以及什么构成“内容”(这在某种程度上是一种判断调用)。当您使用标识符出队时,您假设“格式”是正确的,并且您重置/重做任何“内容”。

标签: ios objective-c uitableview reuseidentifier


【解决方案1】:

无需清除重用标识符。只需在设置新数据后重新加载表格视图。所有可见的单元格将被重新加载。使用相同的重用标识符很好。只要您的cellForRowAtIndexPath 方法使用新数据填充每个单元格,您就会得到想要的结果。

更新 - mkral 的评论是一个很好的澄清。重用标识符表示单元的类型,而不是数据。因此,reuseIdentifier 应该与来自服务器的标识符完全无关,除非服务器的标识符会影响所显示的单元格的类型。

【讨论】:

  • 补充一点,reuseIdentifier 用于识别不同类型的单元格。因此,如果您只有一种类型的单元格,它会检查它是否可以重用具有相同标识符但不再使用的另一个单元格(屏幕外),因此它不会为 1000 条记录创建 1000 个 UITableViewCell 实例。它只会创建 +/- 对表格视图可见的单元格数量,并在滚动时重用不可见的单元格
  • 我拥有的每个单元格都是根据服务器信息唯一创建的,当我初始化单元格时,我会使用来自服务器的数据对其进行初始化。当调用重新加载数据时,表格视图使单元格出列,并且更改不会显示出来,因为没有调用 init。
  • 您需要使用cellForRowAtIndexPath 方法更新您的问题。顺便说一句 - 数据不应传递给单元格的 init... 方法。细胞被重复使用。您需要能够在调用init 后更新单元格的数据。
  • @TheGuardian - 你不会init 单元格的可变内容。您创建一个“空”单元格并在cellForRowAtIndexPath 中设置变量内容。
  • 我更改了我的数据结构,以便将数据设置在 cellForRowAtIndexPath 中。谢谢大家。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-06
  • 2013-01-24
相关资源
最近更新 更多