UITableViewCell уникальный идентификатор? - PullRequest
2 голосов
/ 04 ноября 2011

Я ищу способ уникальной идентификации экземпляров UITableViewCell даже после того, как они были переработаны (удалены из очереди) через DequeueReusableCell (идентификатор строки) - без создания подклассов или с использованием объекта контейнера.

Таким образом, в основном, когда я создаю новую ячейку, я хочу использовать уникальный идентификатор этой ячейки в качестве ключа для хранения другого связанного объекта в словаре. Позже, когда ячейка будет переработана / снята с производства, я хочу прочитать соответствующие возражения из словаря. Я полностью осознаю, что переработанная ячейка может быть помещена в любой путь индекса в таблице и может (скорее всего) содержать другие данные, чем прежде - другой объект действительно связан с экземпляром ячейки, а не путем индекса.

Следует избегать потери отношения к объекту. Полученный идентификатор должен любой ценой быть тем же, который использовался при создании ячейки.

Ранее это было достигнуто путем генерации случайного числа и сохранения его в качестве тега ячейки. Тем не менее, эти теги могут сталкиваться (когда одно и то же случайное число генерируется дважды), и я хотел бы только реализовать предотвращение столкновений в качестве крайней меры. Поэтому я ищу лучший путь.

Я смотрел ClassHandle , Handle и SuperHandle свойства. Похоже, единственным, кто остается последовательным среди дежурств, является ClassHandle.

Безопасно ли для этой цели использовать свойство ClassHandle? Если нет, какие еще варианты есть?

Ответы [ 3 ]

2 голосов
/ 04 ноября 2011

В дополнение к ответу Джонатана Пеппера, это довольно распространенная техника, используемая в многочисленных онлайн-примерах:

Всякий раз, когда вы создаете новую ячейку в своем методе GetCell, устанавливайте ячейку Tag, используя

cell.Tag = Environment.TickCount;

Это особенно полезно, если у вас есть пользовательский объект ячейки. Затем ваши ячейки могут отслеживаться в вашем классе источника данных с помощью словаря, например:

Dictionary<int, your_cell_type> cells = ...

Если вам нужно отследить что-то определенное для ячейки, вы можете использовать Tag, чтобы найти его в вашем словаре.

2 голосов
/ 05 ноября 2011

Вы можете создать свое собственное монотонно возрастающее число:

static int monotonicNumber;

и затем установите тег на:

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

Обратите внимание, что Environment.TickCount не гарантированно является уникальным, вы можете получить одинаковое количество тиков, если получите его быстро. Я знаю, потому что это случилось со мной.

1 голос
/ 04 ноября 2011

Вы также можете использовать Guid: http://msdn.microsoft.com/en-us/library/system.guid.newguid.aspx

Это стандартные, проверенные на всегда уникальные идентификаторы для .Net. Они доступны как в Windows, так и в Mono, где угодно.

Я предполагаю, что свойство Tag - это объект, и вы можете хранить его там (но, может быть, это зная Apple). Если нет, вы можете создать подкласс UITableViewCell для добавления свойства типа Guid.

...