Статические ячейки раскадровки: dequeueReusableCellWithIdentifier возвращает ноль - PullRequest
21 голосов
/ 03 апреля 2012

Используя раскадровку, статические ячейки, в cellForRowAtIndexPath: строке

UITableViewCell *cell = 
   [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

всегда возвращается nil.

Я проверил следующее:

  • Идентификатор ячейки правильно установлен в IB / Раскадровке, и я использую тот же идентификатор в коде.Я проверял это много раз.
  • Я не создавал экземпляр контроллера представления в другом месте (что было проблемой в в этом вопросе о потоке стека ).

Мой контроллер представления является подклассом UITableViewController, конечно, обернутым в ad hoc контроллер навигации в раскадровке.Подозревая, что мой контроллер представления каким-то образом не знает об идентификаторах ячеек, определенных в раскадровке, потому что это может быть другой экземпляр, вот код, который его «создает».В prepareForSegue: я использую

CustomViewController *vc = [[[segue destinationViewController] 
   viewControllers] objectAtIndex:0];

Другие настройки контроллера представления, выполненные здесь (настройка свойств и т. Д.), Работают нормально.

Я использую статические ячейки, потому что число секций иСтроки не изменяются, и каждая ячейка содержит статический текст (и другие элементы управления или текстовые поля, подлежащие редактированию).

Мне кажется, это очень распространенная задача (настроить статические ячейки из раскадровки в методах источника данных контроллера представления).Что я делаю не так?

Ответы [ 5 ]

44 голосов
/ 03 апреля 2012

Со статическим содержимым в табличном представлении вы не реализуете ни один из методов источника данных (включая tableView:cellForRowAtIndexPath:), поэтому вы никогда не удалите очереди из ячеек. Для статического содержимого нет никакой очереди (в любом случае вы можете участвовать в этом)).

Если вы хотите получить указатель на определенную ячейку:

  • получите его из табличного представления, используя cellForRowAtIndexPath::

    UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
    
  • имеет выход к определенной ячейке и настраивает его напрямую.

  • Итерируйте по ячейкам и проверьте свойство reuseIdentifier, чтобы получить интересующую вас ячейку.

Любая из этих вещей может быть выполнена в viewWillAppear или аналогичной.

Если вы хотите, чтобы содержимое ваших ячеек полностью отличалось от содержимого на раскадровке, статические ячейки, вероятно, не являютсяправильный выбор. Вы должны использовать динамические прототипы (обратите внимание, что вы можете иметь несколько прототипов в раскадровке) вместо традиционных методов источника данных.

0 голосов
/ 26 июля 2016

Вы все еще можете использовать статические методы dataSource / делегата UITableView, вам просто не нужно создавать новые ячейки.

Если вы хотите изменить ячейки с помощью методов источника данных, внутри cellForRowAtIndexPath::

UITableViewCell * cell = [super tableView:tableView cellForRowAtIndexPath:indexPath];

и затем начните модифицировать ячейку.

0 голосов
/ 07 января 2016

В раскадровке Статические ячейки НЕ МОГУТ реализовать Методы в протоколе <UITableViewDataSource>.

Таким образом, вы можете использовать методы, которые включены в <UITableViewDelegate>.

0 голосов
/ 27 ноября 2014

В отличие от ответа выше,

UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];

не будет работать.Но упомянутый способ создания выхода для самого cell работает.

Также возможно разместить виды, такие как UIButtons или UITextFields, на cell и иметь выходы для тех, ктохорошо.

Оба метода также могут использоваться в комбинации.Например, установите cell.textLabel.text для конкретной ячейки и получите другой элемент управления, к которому будет обращаться из розетки элементов управления.

0 голосов
/ 03 апреля 2012

Решением было использование прототипов, а не статических ячеек. Я до сих пор передаю чек @jrturton, так как он первым дал мне эту идею.

Еще одна интересная ошибка, которую я только что исправил: с ячейками-прототипами типа "Custom", если вы попытаетесь заполнить текст cell.textLabel, он просто будет работать автоматически, но все остальные ваши подпредставления ведут себя очень странно. Сейчас я просто использую свой собственный ярлык, и все работает нормально.

Ура, спасибо всем за помощь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...