UITableViewCell唯一标识符?

问题描述:

我正在寻找一种方法来唯一标识UITableViewCells的实例,即使它们已经通过DequeueReusableCell(string identifier)再循环(出列)后 - 没有子类化或使用容器对象。UITableViewCell唯一标识符?

所以基本上,当我创建一个新的单元格时,我想使用这个单元格的唯一标识符作为在字典中存储另一个相关对象的键。之后,当细胞被回收/出列时,我想阅读字典中的相关反对词。 我完全意识到再循环单元可以放置在表中的任何索引路径处,并且可能(很可能)包含比以前更多的其他数据 - 另一个对象实际上与单元实例相关,而不是索引路径。

必须避免与物体的松动关系。获得的ID必须不惜一切代价与创建单元格时使用的相同。

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

我看过ClassHandle,HandleSuperHandle属性。唯一一个在排队中保持一致的人似乎是ClassHandle。

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

+0

出于好奇,是否有一个特别的原因,你不想子类UITableViewCell?这样做很可能会使应用程序复杂得多,因为您可以直接在单元中存储任何类型的引用,而无需担心。我们创建了一个非常简单的继承类,它有一个非常灵活的Object标签,并且适用于我们迄今为止所面对的每种场景。 –

+0

Android和iOS版本的应用程序当前都使用字典为每个单元存储一个附加对象(如果需要)。我只想保持一致。 – riha

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

static int monotonicNumber; 

,然后设置标签:

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

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

+0

1)为什么要静态?请解释。 2)简单地++数字可以吗? AFAIK,只有UI线程才会执行UI代码。 – riha

+0

1)为什么不呢?它实际上取决于您的代码,如果您知道跨类的多个实例不需要唯一的ID,则也可以使用实例字段。由于我不知道你是否需要,我选择了安全选项:静态。 2)是的,如果它只会被UI线程使用,你可以使用增量运算符++。 –

+0

感谢您的澄清 – riha

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

这些都是标准的,被证明始终是唯一的,对于.NET的ID。这些可以在Windows上运行,也可以在任何地方运行。

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

+0

标记是一个int(不幸) – riha

+0

你应该为你的目的子类UITableViewCell的声音。他们仍然会使用DequeueReuseableCell正确出来,您可以投射到您的新类型。 – jonathanpeppers

除了乔纳森辣椒的答案,这是在网上无数的例子使用一个相当普遍的技术:

每当你在GetCell方法创建一个新的细胞,将细胞的Tag使用

cell.Tag = Environment.TickCount; 

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

Dictionary<int, your_cell_type> cells = ... 

如果您需要跟踪一些细胞特异性,您可以使用Tag查一查你的字典对象。

+0

看起来很有希望,我会试一试并回报。 – riha

+0

这是原始的文章,我从这个想法得到:http://www.infoq.com/articles/monotouch-custom-tables – Ryan

+0

如果你采取这种方法,你必须非常小心地删除对单元格的引用字典对象,以便在字典中积累一堆单元时不会出现内存泄漏。 –