Ошибка утверждения при использовании pushViewController для TableViewController

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

[self.navigationController pushViewController:photosTVC animated:YES];

Однако я получаю «ошибку утверждения» при загрузке контроллера табличного представления; в частности, во второй строке этого метода:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"Photo";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];
...

Контроллер табличного представления загружается нормально при переходе на него с помощью перехода, но не при таком переходе. Любые идеи, которые я мог бы попробовать, будут высоко оценены!

Спасибо за чтение.

РЕДАКТИРОВАТЬ: Полный текст ошибки приведен ниже:

Ошибка утверждения в -[UITableView dequeueReusableCellWithIdentifier:forIndexPath:], /SourceCache/UIKit_Sim/UIKit-2372/UITableView.m:4460


person Rogare    schedule 02.12.2012    source источник
comment
Какая полная ошибка?   -  person rmaddy    schedule 03.12.2012


Ответы (1)


Чтобы использовать [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];, ячейка должна быть зарегистрирована с помощью registerNib:forCellReuseIdentifier: или registerClass:forCellReuseIdentifier:, что делается за вас, если вы используете раскадровку.

Поэтому используйте только этот метод, [tableView dequeueReusableCellWithIdentifier:CellIdentifier], когда вы делаете это программно, если нет особых причин не делать этого.

РЕДАКТИРОВАТЬ:

UITableViewCell* cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil)
{
    // or whatever cell initialisation method you have / created
    cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
}
person X Slash    schedule 03.12.2012
comment
Спасибо за ответ. Поскольку мне нужен доступ к indexPath позже в методе, похоже, мне нужно будет реализовать registerNib/registerClass. Если мне по-прежнему нужно сохранить функциональность при переходе с переходом, следует ли мне реализовать оба метода регистрации? - person Rogare; 03.12.2012
comment
даже если вы используете только [tableView dequeueReusableCellWithIdentifier:CellIdentifier], у вас все еще будет доступ для indexPath позже, tableView:cellForRowAtIndexPath: все еще дает вам indexPath. Вы будете реализовывать registerNib/registerClass в зависимости от того, что вы делаете, создаете ли вы подкласс UITableViewCell или просто прототипируете ячейку, используя файлы NIB, но я все же думаю, что вы можете обойтись просто [tableView dequeueReusableCellWithIdentifier:CellIdentifier]. - person X Slash; 03.12.2012
comment
Хорошо, используя только этот метод, исходная ошибка исчезла. Спасибо! Однако здесь он срабатывает: Ошибка утверждения в -[UITableView _configureCellForDisplay:forIndexPath:], /SourceCache/UIKit_Sim/UIKit-2372/UITableView.m:5471 - person Rogare; 03.12.2012
comment
Хорошо, это здорово — это работает. Табличное представление успешно появляется, так что это отвечает на мой первоначальный вопрос. UIBarButtonItem и переход, которые я настроил в раскадровке, больше не работают при программном переходе... Я начинаю видеть недостатки использования раскадровок (или, по крайней мере, в том, как я их использую). - person Rogare; 04.12.2012