我正在寻找一种方法来唯一地识别UITableViewCells的实例,即使它们已经通过DequeueReusableCell(string identifier)被回收(出列) - 没有子类化或使用容器对象。
所以基本上,当我创建一个新单元格时,我想使用这个单元格的唯一id作为在字典中存储另一个相关对象的键。稍后,当单元格被循环/出列时,我想阅读字典中的相关对象。 我完全清楚可以将再生单元放置在表中的任何索引路径上,并且可能(很可能)包含除之前的其他数据 - 另一个对象确实与单元实例相关,而不是索引路径。 / em>的
必须避免失去与对象的关系。获得的id必须与生成单元格时使用的成本相同。
之前通过生成随机数并将其存储为单元格标记来实现。但是,这些标签可能会发生冲突(当两次生成相同的随机数时),我只想将避免碰撞作为最后的手段。所以我正在寻找更好的方法。
我查看了ClassHandle,Handle和SuperHandle属性。出现在队列中的唯一一个似乎是ClassHandle。
为此目的使用ClassHandle属性是否安全?如果没有,还有其他选择吗?
答案 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类型的属性。