tableView: dequeueReusableCellWithIdentifier проблемы с «глобальной» константой
Спасите мои волосы, пожалуйста, или укажите на мою (очевидную) ошибку. Я пытаюсь использовать UITableViewStyleUITableViewCellStyleSubtitle
в подклассе UITableViewController.
Я определяю статическую константу в реализации:
static NSString * const kAHCellIdentifier;
ВviewDidLoad
Я регистрирую класс tableView:
[self.tableView registerClass:[UITableViewCell class] forCellReuseIdentifier:kAHCellIdentifier];
Затем вtableView:cellForRowAtIndexPath
Я инициализирую ячейку следующим образом:
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:kAHCellIdentifier];
if (cell == nil) {
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:kAHCellIdentifier];
}
При запуске приложения (устройства или сима) ячейки загружаются, но detailTextLabel не отображается, однако, если я инициализирую таким образом, он работает правильно *
Я предполагаю, что константа на самом деле не является статической, или что есть ошибка (8.0.2), или есть что-то, что я пропускаю полностью из-за недостатка сна или чего-то еще.
Также можно отметить, что если я не регистрирую класс, то возникает ошибка компилятора (ожидаемая), но нет ошибки, даже если идентификаторы ячеек различны (что, я полагаю, ожидается, поскольку я могу зарегистрировать разные классы для разных стилей ячеек).
Что мне не хватает?
редактировать
С помощью[tableView dequeueReusableCellWithIdentifier:kAHCellIdentifier forIndexPath:indexPath];
также не имеет никакого эффекта.
Короче вопрос
ПочемуdequeueReusableCellWithIdentifier
вернуть ноль и, таким образом, инициировать ячейку, используя UITableViewCellStyle вcell == nil
блок, если я использую статическую строку NSString вcellForRowAtIndexPath
вызова метода, и нет, если я использую глобальную константу уровня класса, как определено выше.
дополнительный
Еще несколько испытаний дали несколько иные результаты. Если вы зарегистрируете класс для идентификатора повторного использования ячейки, а затем дадите ячейке другой идентификатор вcellForRowAtIndexPath
тогда это работает. Если вы дадите ему то же имя, что и зарегистрированный класс, он не будет работать, как ожидалось.
Ответ
После некоторого тестирования и ответа @ MANIAK_dobrii, некоторая ясность.
Если вы хотите использовать более новый метод удаления ячеекdequeueReusableCellWithIdentifier:forIndexPath
и нужно использоватьUITableViewCellStyle
кроме по умолчанию, вам нужно подклассUITableViewCell
и переопределить стиль таблицы вinitWithStyle
вызов метода.
Если вы счастливы использовать старый метод, убедитесь, что вы не зарегистрировали класс для идентификатора повторного использования, иначе он не будет работать.