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

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

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

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

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

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

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

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

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

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

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

http://sofru.miximages.com/iphone/ezgif-3302899694.gif

  • Ошибка UICollectionView Assertion
  • Получить процентное использование процессора
  • Могу ли я передать блок как @selector с Objective-C?
  • Как я могу нажать кнопку за прозрачным UIView?
  • Типы в объективе-c на iPhone
  • UILongPressGestureRecognizer вызывается дважды при нажатии
  • Класс Foo реализован как в MyApp, так и в MyAppTestCase. Один из двух будет использован. Какой из них не определен
  • Почему мой коллега MCSession отключается случайно?
  • Изучение основ UIScrollView
  • Переменная Property vs. instance
  • Использование Swift CFunctionPointer для передачи обратного вызова API CoreMIDI
  • Давайте будем гением компьютера.