iPhone - Что такое reuseIdentifiers (UITableViewCell)?

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

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

http://developer.apple.com/iphone/library/documentation/UIKit/Reference/UITableViewCell_Class/Reference/Reference.html

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

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

3 ответа

Решение

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

Используя 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.

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

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

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

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

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

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

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

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

Другие вопросы по тегам