2

我正在寻找一种方法来唯一标识 UITableViewCells 的实例,即使它们已通过DequeueReusableCell(string identifier) 被回收(出列) - 无需子类化或使用容器对象。

所以基本上,当我创建一个新单元格时,我想使用这个单元格的唯一 id 作为键来将另一个相关对象存储在字典中。稍后,当单元格被回收/出队时,我想从字典中读取相关的反对。我完全知道回收的单元格可以放置在表中的任何索引路径中,并且可能(很可能)包含比以前更多的数据 - 另一个对象确实与单元格实例相关,而不是索引路径。

必须避免与对象失去关系。获得的 id 必须不惜一切代价与创建单元格时使用的相同。

这以前是通过生成一个随机数并将其存储为单元格的标签来实现的。但是,这些标签可能会发生冲突(当两次生成相同的随机数时),我只想将避免冲突作为最后的手段。所以我正在寻找更好的方法。

我查看了ClassHandleHandleSuperHandle属性。出队中唯一保持一致的似乎是 ClassHandle。

为此目的使用 ClassHandle 属性是否安全?如果没有,还有哪些其他选择?

4

3 回答 3

2

除了 Jonathan Pepper 的回答之外,这是在许多在线示例中使用的相当常见的技术:

每当您在GetCell方法中创建新单元格时,请设置单元格的Tag使用

cell.Tag = Environment.TickCount;

如果您有自定义单元格对象,这将特别有用。然后可以使用字典在数据源类中跟踪您的单元格,例如:

Dictionary<int, your_cell_type> cells = ...

如果您需要跟踪特定于单元格的内容,可以使用Tag来在您的字典对象上查找它。

于 2011-11-04T13:58:32.807 回答
2

您可以创建自己的单调递增数:

static int monotonicNumber;

然后将标签设置为:

cell.Tag = System.Threading.Interlocked.Increment (ref monotonicNumber);

请注意,Environment.TickCount 不能保证是唯一的,如果您快速连续获取它,您可以获得相同的滴答计数。我知道,因为它发生在我身上。

于 2011-11-04T22:25:51.310 回答
1

您还可以使用 Guid:http: //msdn.microsoft.com/en-us/library/system.guid.newguid.aspx

这些是 .Net 的标准,被证明始终是唯一的 id。这些可在 Windows 以及在任何地方运行的 Mono 上使用。

我假设 Tag 属性是一个对象,您可以将它存储在那里(但可能是一个知道 Apple 的 int )。如果没有,您可以继承 UITableViewCell 以添加 Guid 类型的属性。

于 2011-11-04T12:24:46.073 回答