UITableView Ошибка удаления строки
Я новичок в разработке приложений для iPhone. Так что, пожалуйста, будьте спокойны со мной:)
Я пытался реализовать удаление строки из UItableView, когда я получаю эту ошибку, которую я не могу понять, почему
Invalid update: invalid number of rows in section 0. The number of rows contained in an existing section after the update (6) must be equal to the number of rows contained in that section before the update (4), plus or minus the number of rows inserted or deleted from that section (0 inserted, 1 deleted).'
Вот мой код для удаления метода элемента
-(void)deleteItem:(NSIndexPath *)path{
Item *i = (Item *)[list objectAtIndex:path.row];
NSLog(@"Deleting item [%@]", i.iName);
int ret;
const char *sql = "delete from items where id = ?;";
if (!deleteStmt)
{ // build update statement
if ((ret=sqlite3_prepare_v2(db, sql, -1, &deleteStmt, NULL))!=SQLITE_OK)
{
NSAssert1(0, @"Error building statement to delete items [%s]", sqlite3_errmsg(db));
}
}
// bind values to statement
NSInteger n = i.iId;
sqlite3_bind_int(deleteStmt, 1, n);
// now execute sql statement
if ((ret=sqlite3_step(deleteStmt)) != SQLITE_DONE)
{
NSAssert1(0, @"Error deleting item [%s]", sqlite3_errmsg(db));
}
// now reset bound statement to original state
sqlite3_reset(deleteStmt);
[list removeObjectAtIndex:path.row]; // remove from table
[self readTable]; // refresh array
}
и это стиль коммиттинга UITableView
- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath {
if (editingStyle == UITableViewCellEditingStyleDelete) {
[appDelegate deleteItem:indexPath];
[tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
}
}
Может кто-нибудь, пожалуйста, скажите мне, что я делаю не так. Из того, что я понимаю, количество строк в разделе не обновляется. Я прав??
Заранее спасибо.
4 ответа
После некоторого переосмысления кода сам разобрался с решением. Проблема была с
readTable()
где старый массив не был очищен перед повторным чтением. Я использовал
[list removeAllObjects]
метод, чтобы очистить его. Это сработало наконец.:)
Как указано в Руководстве по программированию Apple Table View для iOS, порядок удаления имеет отношение:
сначала удалите элемент из таблицы; во-вторых, удалите его из модели.
Таким образом, вы должны переключить две команды удаления:
[tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
[appDelegate deleteItem:indexPath];
Я не вижу [таблица reloadData]; это работает? Обычно это требуется.
По моему скромному мнению и после попытки сделать то же самое, похоже, что таблица все еще считает, что количество строк не изменилось, поэтому я скрываю строку и, похоже, она работает для меня.