it-swarm.com.ru

Статические ячейки раскадровки: dequeueReusableCellWithIdentifier возвращает ноль

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

UITableViewCell *cell = 
   [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

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

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

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

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

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

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

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

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

21
Mundi

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

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

  • получить его из таблицы, используя cellForRowAtIndexPath::

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

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

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

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

44
jrturton

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

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

0
s1ro6

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

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

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

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

0
farzadshbfn

Отличается от ответа выше, 

UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];

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

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

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

0
Marcus

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

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

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

0
Mundi