С раскадровками и табличными представлениями, имеющими ячейки-прототипы, [tableView dequeueReusableCellWithIdentifier:]
не должно возвращать ноль.Даже если это самая первая ячейка, и в очереди на повторное использование уже нет ячеек, просмотр таблицы создаст новый экземпляр ячейки-прототипа и вернет его.
В вашем случае проблема заключалась в том, что проблема была полностьюдругой (я скачал ваш проект, потому что мне было очень любопытно).
В делегате вашего приложения в вашем методе application:didFinishLaunchingWithOptions:
вы повторно инициализируете этот tableviewcontroller.Когда вы вызываете [masterController init]
, это вызывает [super init]
, что, в свою очередь, вызывает [UITableViewController initWithStyle:]
.
, что заставляет контроллер создавать новый UITableView, который отличается от того, что в вашей раскадровке.Этот новый UITableView не имеет ячеек-прототипов, и поэтому dequeueReusableCellWithIdentifier:
возвращает ноль.
Урок, конечно, состоит в том, чтобы не повторно инициализировать объект Objective C, который уже был инициализирован.Когда ваш контроллер табличного представления загружается из раскадровки, механизм загрузки инициализирует его с initWithCoder:
.Поэтому, если вам нужно выполнить какую-то пользовательскую инициализацию (например, настроить NSMutableArray в вашем случае), просто переопределите initWithCoder:
и / или awakeFromNib
.
Вы можете переопределить эти методы по мере необходимости, но не вызывайте их сами.И initWithCoder:
, и awakeFromNib
будут вызываться механизмом загрузки раскадровки / пера.
Если все правильно, вам не нужно создавать ячейки здесь программно.Этот бит кода не нужен:
// This bit is unnecessary with storyboards:
if (newCell == nil) {
newCell = [[UITableViewCell alloc] initWithStyle: UITableViewCellStyleSubtitle reuseIdentifier: MAINVIEW_CELLIDENTIFIER];
[newCell autorelease];
newCell.selectionStyle = UITableViewCellSelectionStyleNone;
}
Надеюсь, это поможет.