Статический UITableViewCell возвращает nil для CellForRowAtIndexPath, но только для определенных разделов.

Я определил контроллер табличного представления, используя статические ячейки в сцене раскадровки. Само табличное представление содержит шесть разделов, каждый из которых содержит одну или две ячейки. Я пишу данные в ячейки из этого метода в моем контроллере представления:

- (void)setUpAllCells
{
    //Charge Name
    NSIndexPath *path = [NSIndexPath indexPathForRow:0 inSection:0];
    TableViewCellTextField *currentTextField = (TableViewCellTextField *)[[self tableView] cellForRowAtIndexPath:path];
    [currentTextField.textField setDelegate:self];

    //Charge Description
    path = [NSIndexPath indexPathForRow:1 inSection:0];
    currentTextField = (TableViewCellTextField *)[[self tableView] cellForRowAtIndexPath:path];
    [currentTextField.textField setDelegate:self];

    ...

    path = [NSIndexPath indexPathForRow:0 inSection:5];
    TableViewCellControl *currentControl = (TableViewCellControl *)[[self tableView] cellForRowAtIndexPath:path];
    [currentControl setValue:m_data->trailBurnTime];
}

Который вызывается из:

- (void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];
    [self setUpAllCells];
}

Когда я запускаю приложение, каждая ячейка отвечает так, как я ожидаю, за исключением последнего раздела.
Ячейки последнего раздела не подключены к моему контроллеру и сохраняют свои значения по умолчанию из сцены раскадровки. Я установил точку останова в setUpAllCells и обнаружил, что cellForRowAtIndexPath возвращает nil для этого последнего раздела.

Я использовал этот формат для пяти других контроллеров представления, и этого не произошло.

Вот что я пробовал до сих пор:

  • Я проверил это с помощью своих собственных пользовательских ячеек TableViewCell и, когда они не работали, стандартных ячеек UITableViewCell. Последний раздел всегда возвращает ноль.

  • Переставил разделы и ячейки. Последний раздел всегда возвращает ноль.

  • Я полностью удалил этот раздел. Остальные разделы и без него нормально работают.

  • Я добавил больше разделов. Все из раздела 5 возвращает nil в CellForRowAtIndexPath.

Я в недоумении. Я не могу понять, что может быть причиной этого.

Предложения?


person bindsniper001    schedule 23.05.2013    source источник
comment
Если в вашем табличном представлении 6 разделов, то 6-го раздела нет, как в последнем фрагменте кода.   -  person rdelmar    schedule 23.05.2013
comment
@rdelmar Упс. Я ввел это неправильно. Это было 5 в моем исходном коде. Это осталось от тестирования, которое я провел, как описано в нижней части вопроса.   -  person bindsniper001    schedule 23.05.2013


Ответы (2)


Я не знаю, почему вы получаете такие результаты - когда я пробовал и регистрировал ячейки, я получил действительные ячейки только для первых трех разделов. Все, что было дальше раздела 2, было нулевым. Честно говоря, я не уверен, почему это вообще работает, поскольку Apple не говорит, что это способ заполнения статического табличного представления. Вы должны создать IBOutlets в контроллере табличного представления для элементов пользовательского интерфейса в ваших ячейках. В этом отношении статическое табличное представление больше похоже на представление прокрутки с подпредставлениями, чем на табличное представление. Вы также можете сделать IBOutlets для самих ячеек вместо отдельных элементов пользовательского интерфейса, а затем использовать точечную нотацию для обращения к любым свойствам в вашей пользовательской ячейке или к стандартным свойствам, таким как textLabel и detailTextLabel.

person rdelmar    schedule 23.05.2013
comment
Да, это было так. Я удалил вызовы CellForRowAtIndexPath и создал IBOutlets для своих ячеек. Теперь все работает нормально. Я считаю, что причина, по которой это работало для большинства ячеек, заключается в том, что они были на экране. То есть не работали только те ячейки, которые были ниже экрана при загрузке представления. Я думаю, это потому, что табличное представление изначально загружает только видимые ячейки. Итак, когда я попытался получить доступ к ячейкам с помощью CellForRowAtIndexPath, за шестым разделом данных не было. - person bindsniper001; 23.05.2013

Забавная история о вашем вопросе заключается в том, что когда вы вызываете функцию cellForRowAtIndexPath в своем табличном представлении, я полагаю, что она, в свою очередь, вызывает функцию обратного вызова делегата, которую вы должны реализовать как UITableViewDelegate, которая предоставляет TableView с помощью cellForRowAtIndexPath.

Как только вы реализуете эту функцию, вы вернете ячейку. Я думаю, что функция, которую вы ищете, это:

– dequeueReusableCellWithIdentifier:forIndexPath:
– dequeueReusableCellWithIdentifier:

Посмотрите здесь: http://developer.apple.com/library/ios/#documentation/uikit/reference/UITableView_Class/Reference/Reference.html

Я знаю, что это не тот ответ, который вы искали, но это правда :).

person Aditya Nagrath    schedule 23.05.2013
comment
Это методы представления таблицы. Я создаю собственный контроллер табличного представления, а не табличное представление. Поскольку я не переопределяю базовую реализацию, я не думаю, что мне нужно это делать. - person bindsniper001; 23.05.2013