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

Статические ячейки раскадровки: 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). Что я делаю неправильно?

4b9b3361

Ответ 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];

а затем начните изменять ячейку.