UITableViewCell唯一标识符?

时间:2011-11-04 12:12:18

标签: uitableview xamarin.ios deque

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

所以基本上,当我创建一个新单元格时,我想使用这个单元格的唯一id作为在字典中存储另一个相关对象的键。稍后,当单元格被循环/出列时,我想阅读字典中的相关对象。 我完全清楚可以将再生单元放置在表中的任何索引路径上,并且可能(很可能)包含除之前的其他数据 - 另一个对象确实与单元实例相关,而不是索引路径。 / em>的

必须避免失去与对象的关系。获得的id必须与生成单元格时使用的成本相同。

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

我查看了ClassHandleHandleSuperHandle属性。出现在队列中的唯一一个似乎是ClassHandle。

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

3 个答案:

答案 0 :(得分:2)

除了乔纳森·佩珀的回答,这是一种在网上的大量例子中使用的相当常见的技术:

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

设置单元格Tag
cell.Tag = Environment.TickCount;

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

Dictionary<int, your_cell_type> cells = ...

如果您需要跟踪某些特定的细胞,可以使用Tag在字典对象上查找。

答案 1 :(得分:2)

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

static int monotonicNumber;

然后将标记设置为:

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

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

答案 2 :(得分:1)

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

这些是.Net的标准,经证明永远是唯一的ID。这些都可以在Windows上运行,也可以在任何地方运行Mono。

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