iPhone - Что такое reuseIdentifiers (UITableViewCell)? - PullRequest
50 голосов
/ 28 января 2010

Из официальной документации:

Идентификатор повторного использования связан с объектом UITableViewCell, который создает представитель табличного представления с намерением повторно использовать его в качестве основы (по соображениям производительности) для нескольких строк табличного представления. Он присваивается объекту ячейки в initWithFrame: reuseIdentifier: и после этого не может быть изменен. Объект UITableView поддерживает очередь (или список) текущих многократно используемых ячеек, каждая со своим собственным идентификатором повторного использования, и делает их доступными для делегата в методе dequeueReusableCellWithIdentifier: method.

http://developer.apple.com/iphone/library/documentation/UIKit/Reference/UITableViewCell_Class/Reference/Reference.html#//apple_ref/occ/instp/UITableViewCell/reuseIdentifier

Я не понимаю этого. Ну, я понимаю основную идею, я думаю, что вы создаете UITableViewCells и пытаетесь использовать как можно больше, вместо того, чтобы создавать новые (или что-то в этом роде). Но что именно решает, является ли ячейка многоразовой? Если у меня есть две одинаковые (визуально) ячейки, но с разными текстами (я полагаю, они не полностью идентичны), могут ли они иметь один и тот же идентификатор? Или они должны иметь разные? Или в какой ситуации вы должны использовать разные идентификаторы?

Может кто-нибудь уточнить или дать ссылку на место, где оно находится?

Ответы [ 3 ]

66 голосов
/ 16 февраля 2010

Хорошо, вот как я считаю, это работает:

Используя dequeueReusableCellWithIdentifier для tableView, вы можете значительно ускорить процесс. Вместо создания множества ячеек, вы просто создаете столько экземпляров, сколько необходимо, то есть столько, сколько видимых (это обрабатывается автоматически). Если вы прокручиваете область в списке, где есть «ячейки», которые еще не получили своего визуального представления, вместо создания новых, вы повторно используете уже существующие.

Вы можете попробовать это сами, выполнив следующее:

static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

if (cell == nil)
{
    cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
    NSLog(@"new one");
}
else
{
    NSLog(@"old one");
}

Помните, вы хотите, чтобы dequeueReusableCellWithIdentifier возвращал ячейку, только если она применима. Поэтому, если ячейка будет использоваться повторно, убедитесь, что она соответствует ситуации. Вот для чего нужны reuseIdentifiers. Обычно вам нужен только один. Но может существовать список, который использует несколько разных типов ячеек, и в этом случае вам придется хранить их отдельно, предоставляя разные reuseIdentifiers. В противном случае вы можете получить ячейку, которую вы рассматриваете как ячейку другого типа (например, ячейку UITableView вместо пользовательской ячейки, которую вы хотели).

Так что, в принципе, насколько я понимаю, используйте разные reuseIdentifiers для разных типов ячеек, где kind означает класс. Если вы используете только стандартные ячейки, вам, вероятно, нужен только один reuseIdentifier.

Этот шаблон проектирования известен как объединение объектов .

10 голосов
/ 17 августа 2012

Просто чтобы добавить кое-что к очень хорошему ответу quano: (Я пытался добавить это как комментарий, но это было слишком долго!)

Даже идентификаторы повторного использования могут быть опущены при разработке, хотя это должно быть сделано в очень специфических обстоятельствах. Если у вас есть табличное представление из 6-7 ячеек, и каждая из них отличается, вы можете обнаружить, что создание новой ячейки с nil в качестве идентификатора может быть предпочтительным.

Наличие многократно используемой ячейки означает, что при каждом вызове cellForRowAtIndexPath необходимо проверять ячейку, инициализировать ее, если ячейки многократного использования нет, и за пределами области действия init вы должны явно выполнять итерацию по всем возможным индексным путям и устанавливать значения для каждого ярлыка явно в зависимости от того, какая у вас ячейка! Итак, в табличном виде с 10 ячейками dinstinct вам придется позаботиться о создании ячейки, если она равна нулю, и заполнении ее в зависимости от того, что вы создали.

Следовательно, в этом случае предпочтительно с точки зрения обслуживания кода инициализировать каждую ячейку с идентификатором nil (поскольку она все равно не будет использоваться повторно) и заполнять информацию о каждой ячейке соответствующим образом, не беспокоясь о ее повторном использовании.

2 голосов
/ 17 апреля 2016

UITableView походит на наличие пула ячеек для каждого reuseIdentifier, так что он перерабатывает ячейку

Мне нравится это видео с http://oleb.net/blog/2014/05/scrollviews-inside-scrollviews/

http://im.ezgif.com/tmp/ezgif-3302899694.gif

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...