Самое важное отличие состоит в том, что forIndexPath:
версия утверждает (вылетает), если вы не зарегистрировали класс или перо для идентификатора. Старая (не forIndexPath:
) версия возвращается nil
в этом случае.
Вы регистрируете класс для идентификатора, отправляя registerClass:forCellReuseIdentifier:
в представление таблицы. Вы регистрируете перо для идентификатора, отправляя registerNib:forCellReuseIdentifier:
в представление таблицы.
Если вы создаете представление таблицы и прототипы своей ячейки в раскадровке, загрузчик раскадровки позаботится о регистрации прототипов ячеек, которые вы определили в раскадровке.
Сессия 200 - Что нового в Touch Cocoa из WWDC 2012 обсуждает (тогда новое)forIndexPath:
версию, начиная примерно с 830-х годов. В нем говорится, что «вы всегда получите инициализированную ячейку» (не говоря уже о том, что она вылетит, если вы не зарегистрировали класс или перо).
Видео также говорит, что «это будет правильный размер для этого пути индекса». Предположительно это означает, что он установит размер ячейки перед ее возвратом, посмотрев на собственную ширину табличного представления и вызвав tableView:heightForRowAtIndexPath:
метод вашего делегата (если он определен). Вот почему ему нужен индексный путь.
dequeueReusableCellWithIdentifier:forIndexPath:
всегда будет возвращать ячейку. Он либо повторно использует существующие ячейки, либо создает новую и возвращает, если ячеек нет.Хотя традиционный
dequeueReusableCellWithIdentifier:
возвратит ячейку, если она существует, т. Е. Если есть ячейка, которую можно использовать повторно, она возвращает, а в противном случае возвращает ноль. Таким образом, вы должны написать условие, чтобы проверить наnil
ценность также.Чтобы ответить на ваш вопрос, используйте,
dequeueReusableCellWithIdentifier:
когда вы хотите поддерживать iOS 5 и более поздние версии, такdequeueReusableCellWithIdentifier:forIndexPath
как доступно только на iOS 6+Ссылка: https://developer.apple.com/library/ios/documentation/uikit/reference/UITableView_Class/Reference/Reference.html#//apple_ref/occ/instm/UITableView/dequeueReusableCellWithIdentifier:forIndexPath :
источник
[self.tableView registerNib:[UINib nibWithNibName:@"cell" bundle:nil] forCellReuseIdentifier:@"cell"];
Я никогда не понимал, почему Apple создала новый метод, dequeueReusableCellWithIdentifier: forIndexPath :. Их документация по ним не является полной и вводит в заблуждение. Единственное различие, которое я смог различить между этими двумя методами, состоит в том, что этот старый метод может вернуть nil, если он не находит ячейку с переданным идентификатором, в то время как более новый метод завершается сбоем, если он не может вернуть клетка. Оба метода гарантированно возвращают ячейку, если вы правильно установили идентификатор, и делаете ячейку в раскадровке. Оба метода также гарантированно вернут ячейку, если вы зарегистрируете класс или xib и сделаете вашу ячейку в коде или файле xib.
источник
tableView.estimateHeight
, размер ячейки также будет определен правильно. Я все еще не получаю выгоду от нового метода.Коротко:
Холлеманс М. 2016, глава 2 Контрольный список, ученик IOS (5-е издание). С. 156.
источник
Я бы рекомендовал использовать оба, если вы используете динамически генерируемый контент. В противном случае ваше приложение может неожиданно зависнуть. Вы можете реализовать свою собственную функцию для извлечения дополнительной многократно используемой ячейки. Если это так,
nil
вы должны вернуть пустую ячейку, которая не видна:Swift 3
И расширение для возврата пустой ячейки:
Полный пример того, как его использовать:
источник