Преобразование между уникальным NSIndexPath и уникальным NSUInteger (или int) - PullRequest
2 голосов
/ 05 декабря 2009

Есть ли лучший способ, чем , предлагаемый здесь , для создания однозначного отображения между ячейками табличного представления NSIndexPath и уникальными NSUInteger или int, чтобы создать уникальное tag значение свойства для виджета в ячейке (a UIProgressView)?

Ссылка добавляет методы через расширение категории UIKit, которое преобразуется между NSIndexPath и int, но они работают только для определенного количества строк.

Конечно, я не могу столкнуться с этим пределом, но мне интересно, есть ли сопоставление, которое кто-то придумал, которое может гарантированно работать для любого числа строк.

Ответы [ 2 ]

2 голосов
/ 05 декабря 2009

Нет, на самом деле не существует способа, который гарантированно работал бы для любого количества строк. Если у вас есть таблица с 2 разделами, каждый из которых содержит 3 миллиарда строк, то невозможно сопоставить эти 6 миллиардов потенциальных NSIndexPath с 4 миллиардами 32-битных NSIntegers.

(если бы вы создавали 64-битное приложение, то же самое верно, но в этом примере их число должно быть еще в 4 миллиарда раз больше.)

Они используют ограничение в 10 000 строк на раздел в примере, к которому вы привязаны; если вы серьезно переживаете, у вас может быть больше строк, чем это, вы можете использовать большую константу, то есть вы можете использовать 1 000 000 в качестве максимального количества строк, если вы знаете, что у вас не будет более 4 000 разделов.

Обратите внимание, что "настоящий программист", конечно, предположительно использовал бы 65536 в качестве константы.

0 голосов
/ 06 декабря 2009

Если бы мне нужно было это сделать, я бы просто сдвинул путь к разделу на одну половину 32-разрядного типа int и переместил часть строки на другую. Да, это означает, что вы не можете иметь более 65535 элементов в строке (при его разборе я предположил целые числа без знака, так как строка / раздел никогда не будет отрицательным), но я возьму предполагаемый предел, намного больший, чем мне когда-либо понадобится, более волшебная константа в любой день.

Плюс это дешевле в вычислительном отношении.

Обычно в этой ситуации, хотя я настраивал свой контроллер табличного представления в качестве делегата для каждой ячейки, и ячейка может вызывать контроллер с любыми изменениями вместе с некоторым значением ключа, использованным для создания ячейки - в конце концов, когда вы заполняете ячейка, которую вы знаете, как получить доступ к вашему набору данных, чтобы извлечь значения. Черт возьми, вы даже можете просто сохранить IndexPath в ячейке, и он может перезвонить с этим. Причина, по которой я не стал бы использовать подход IndexPath или предыдущий метод, включающий выравнивание NSIndexPath в теге, заключается в том, что если вы когда-нибудь начнете динамически изменять строки, значения могут выровняться между NSndexPath, с которым вы создали ячейку, и значением для текущего набора данных. Намного лучше иметь какой-то ключ, который всегда логически вернет вас к нужным данным.

...