Приложение TableView прервано из-за «NSInternalInconsistencyException» - PullRequest
7 голосов
/ 04 сентября 2011

Я пытаюсь освоить UITableViews и все, что с этим связано. На данный момент у меня есть следующий код:

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
     return 10; 
} 

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


     if (cell == nil) {
         cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
     }

     [cell.textLabel setText:[NSString stringWithFormat:@"I am cell %d", indexPath.row]];

     return cell; 
}

- (IBAction)killItem {
     NSIndexPath *indexToDelete = [NSIndexPath indexPathForRow:2 inSection:0];
     [tbl deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexToDelete] withRowAnimation:UITableViewRowAnimationRight];
}

И я получаю следующую ошибку при запуске функции killItem:

Завершение работы приложения из-за необработанного исключения «NSInternalInconsistencyException», причина: «Неверное обновление: недопустимое количество строк в разделе 0. Число строк, содержащихся в существующем разделе после обновления (10), должно быть равно количеству строк содержится в этом разделе перед обновлением (10), плюс или минус количество строк, вставленных или удаленных из этого раздела (0 вставлено, 1 удалено). '

Насколько я понимаю, tableViews в основном имеют делегата и источник данных, где источник данных, помимо прочего, определяет, сколько строк должно быть в tableView. Посредством некоторых поисков здесь в stackoverflow я обнаружил, что эта ошибка возникает, когда «источник данных не соответствует реальности», когда он ищет строки, которые не существуют, которые я удалил.

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

Для справки, я заглянул в следующие посты, не понимая, что мне нужно делать:

Ошибка: количество строк в разделе в UITableView в iPhone SDK

Слайд UITableViewCell

Завершение работы приложения из-за необработанного исключения 'NSRangeException', причина: '*** - [NSMutableArray objectAtIndex:]: индекс 1 за пределами [0 .. 0]'

Добавление [tbl reloadData], [tbl beginUpdate] ... [tbl endUpdate] в функцию killItem, похоже, не помогло мне решить проблему.

Заранее спасибо, Тобиас Товедал

Ответы [ 2 ]

13 голосов
/ 04 сентября 2011

Тобиас, что нужно сделать при удалении строк:

// tell the table view you're going to make an update
[tableView beginUpdates];

// update the data object that is supplying data for this table
// ( the object used by tableView:numberOfRowsInSection: )
[dataArray removeObjectAtIndex:indexPath.row];

// tell the table view to delete the row
[tableView deleteRowsAtIndexPaths:indexPath 
           withRowAnimation:UITableViewRowAnimationRight];

// tell the table view that you're done
[tableView endUpdates];

При вызове endUpdate номер, возвращаемый с tableView:numberOfRowsInSection:, должен совпадать с номером на beginUpdate минус количество удаленных строк.

12 голосов
/ 04 сентября 2011

Это довольно просто, проблема заключается здесь:

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    return 10; 
}

Шаблон делегата, используемый Apple, означает, что вы несете ответственность за управление содержимым UITableView через его делегаты, а это означает, чтоесли вы удаляете строку, вы также несете ответственность за удаление данных из модели данных.

Таким образом, после удаления строки будет иметь смысл уменьшить число строк в разделе до «9».тем не менее ваша функция всегда возвращает 10 и, следовательно, выдает исключение.

Обычно при использовании таблицы содержимое меняется, NSMutableArray довольно распространен, вы делаете что-то вроде этого:

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    return [arrayWithStuff count];
}

И затем удаление объекта (removeObjectAtIndex:) из массива автоматически обновит количество строк.

(Редактировать: ответил примерно в то же время, что и Майк Хей *)1015 *, попробуйте последовать его совету! Я пропустил начало / конец обновления, потому что, кажется, вы уже читали об этом)

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