Подтвердить что ты не робот

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

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

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

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

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

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

4b9b3361

Ответ 1

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

Используя 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 означает класс. Если вы используете только стандартные ячейки, вам, вероятно, нужен только один повторный идентификатор.

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

Ответ 2

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

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

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

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