UITableViewCell唯一标识符?
我正在寻找一种方法来唯一标识UITableViewCells的实例,即使它们已经通过DequeueReusableCell(string identifier)再循环(出列)后 - 没有子类化或使用容器对象。UITableViewCell唯一标识符?
所以基本上,当我创建一个新的单元格时,我想使用这个单元格的唯一标识符作为在字典中存储另一个相关对象的键。之后,当细胞被回收/出列时,我想阅读字典中的相关反对词。 我完全意识到再循环单元可以放置在表中的任何索引路径处,并且可能(很可能)包含比以前更多的其他数据 - 另一个对象实际上与单元实例相关,而不是索引路径。
必须避免与物体的松动关系。获得的ID必须不惜一切代价与创建单元格时使用的相同。
这是通过生成一个随机数并将其作为单元格的标记存储来实现的。但是,这些标签可能会发生碰撞(当两次产生相同的随机数时),我只想实现避免碰撞作为最后的手段。所以我正在寻找更好的方法。
我看过ClassHandle,Handle和SuperHandle属性。唯一一个在排队中保持一致的人似乎是ClassHandle。
为此目的使用ClassHandle属性是否安全?如果不是,还有什么其他选择?
您可以创建自己的单调递增数:
static int monotonicNumber;
,然后设置标签:
cell.Tag = System.Threading.Interlocked.Increment (ref monotonicNumber);
注意Environment.TickCount不能保证是唯一的,你可以得到如果您连续快速获取它,则相同的滴答计数。我知道,因为它发生在我身上。
你也可以使用GUID:http://msdn.microsoft.com/en-us/library/system.guid.newguid.aspx
这些都是标准的,被证明始终是唯一的,对于.NET的ID。这些可以在Windows上运行,也可以在任何地方运行。
我假设Tag属性是一个对象,你可以将它存储在那里(但可能是一个int知道苹果)。如果没有,您可以继承UITableViewCell的子类以添加Guid类型的属性。
标记是一个int(不幸) – riha
你应该为你的目的子类UITableViewCell的声音。他们仍然会使用DequeueReuseableCell正确出来,您可以投射到您的新类型。 – jonathanpeppers
除了乔纳森辣椒的答案,这是在网上无数的例子使用一个相当普遍的技术:
每当你在GetCell
方法创建一个新的细胞,将细胞的Tag
使用
cell.Tag = Environment.TickCount;
如果您有自定义单元格对象,这将特别有用。你的细胞然后可以在您的数据源类使用字典进行跟踪,例如:
Dictionary<int, your_cell_type> cells = ...
如果您需要跟踪一些细胞特异性,您可以使用Tag
查一查你的字典对象。
出于好奇,是否有一个特别的原因,你不想子类UITableViewCell?这样做很可能会使应用程序复杂得多,因为您可以直接在单元中存储任何类型的引用,而无需担心。我们创建了一个非常简单的继承类,它有一个非常灵活的Object标签,并且适用于我们迄今为止所面对的每种场景。 –
Android和iOS版本的应用程序当前都使用字典为每个单元存储一个附加对象(如果需要)。我只想保持一致。 – riha