Статические ячейки раскадровки: dequeueReusableCellWithIdentifier возвращает nil
Используя раскадровку, статические ячейки, в cellForRowAtIndexPath:
строку
UITableViewCell *cell =
[tableView dequeueReusableCellWithIdentifier:CellIdentifier];
всегда возвращает nil
.
Я проверил следующее:
- Идентификатор ячейки правильно установлен в IB/Storyboard, и я использую тот же идентификатор в коде. Я проверял это много раз.
- Я не создавал экземпляр диспетчера представлений в другом месте (что было проблемой в qaru.site/info/146948/...).
Мой контроллер просмотра - это подкласс UITableViewController
, который, конечно, завернут в специальный навигационный контроллер в раскадровке. Подозревая, что мой диспетчер представлений каким-то образом не знает о идентификаторах ячеек, определенных в раскадровке, потому что это может быть другой экземпляр, вот код, который "создает" его. В prepareForSegue:
я использую
CustomViewController *vc = [[[segue destinationViewController]
viewControllers] objectAtIndex:0];
Другие настройки контроллера просмотра, выполняемые здесь (настройка свойств и т.д.), прекрасны.
Я использую статические ячейки, потому что количество разделов и строк не изменяется, и каждая ячейка содержит статический текст (и другие элементы управления или текстовые поля для редактирования).
Мне кажется, что это очень распространенная задача (настроить статические ячейки из раскадровки в методах данных datasource). Что я делаю неправильно?
Ответы
Ответ 1
Со статическим содержимым в представлении таблицы вы не применяете ни один из методов источника данных (включая tableView:cellForRowAtIndexPath:
, поэтому вы никогда не удаляете ячейки из ячеек. Для статического контента (который вы можете участвовать в любом случае)).
Если вы хотите получить указатель на определенную ячейку:
-
получить его из представления таблицы с помощью cellForRowAtIndexPath:
:
UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
-
имеют выход к конкретной ячейке и настраивают ее напрямую.
- Перейдите через ячейки и проверьте свойство
reuseIdentifier
, чтобы получить интересующую вас ячейку.
Любая из этих вещей может быть выполнена в viewWillAppear или аналогичной.
Если вы хотите иметь совершенно другой контент в своих ячейках, который находится на раскадровке, тогда статические ячейки, вероятно, не являются правильным выбором. Вы должны использовать динамические прототипы (обратите внимание, что вы можете иметь несколько прототипов в раскадровке) вместо традиционных методов источника данных.
Ответ 2
Решением было использование прототипов, а не статических ячеек. Я все еще даю чек на @jrturton, поскольку он был первым, кто дал мне эту идею.
Еще одна интересная ошибка, которую я только что решил: с прототипом ячеек типа "Пользовательский", если вы попытаетесь заполнить текст cell.textLabel
текстом, он просто будет работать автоматически, но все ваши другие подсмотры ведут себя очень странно. Я просто использую свой собственный ярлык сейчас, и все работает нормально.
Привет, спасибо всем за помощь.
Ответ 3
В отличие от ответа выше,
UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
не будет работать. Но указанный способ создания выхода к cell
сам работает.
Также возможно разместить такие точки, как UIButtons
или UITextFields
на cell
, и для них также есть выходы.
Оба метода также могут использоваться в комбинации. Например. установите cell.textLabel.text
для конкретной ячейки и получите еще один элемент управления, доступ к которому будет осуществляться из выходов управления.
Ответ 4
В раскадровке статические ячейки НЕ МОГУТ реализовать методы в протоколе <UITableViewDataSource>
.
Итак, вы можете использовать методы, которые входят в <UITableViewDelegate>
.
Ответ 5
Вы все равно можете использовать методы dataSource/delegate static UITableView
, вам просто не нужно создавать создавать новые ячейки.
Если вы хотите изменить ячейки с помощью методов dataSource, внутри cellForRowAtIndexPath:
:
UITableViewCell * cell = [super tableView:tableView cellForRowAtIndexPath:indexPath];
а затем начните изменять ячейку.