iPhone-App аварийно завершает работу при удалении строки UITableView
У меня есть UITableView, который использует одноэлементный объект в качестве источника данных.
Я реализовал следующие методы, чтобы позволить пользователю удалять строки в UITableView. Но когда я нажимаю кнопку удаления, приложение вылетает с исключением
Методы:
-(void)viewDidLoad
{
some initialization code-----
UIBarButtonItem *editButton = [[UIBarButtonItem alloc] initWithTitle:@"Delete" style:UIBarButtonItemStyleBordered target:self action:@selector(toggleEdit:)];
self.navigationItem.rightBarButtonItem = editButton;
[editButton release];
}
-(IBAction)toggleEdit:(id)sender
{
[self.myOrderTable setEditing:!self.myOrderTable.editing animated:YES];
if(self.myOrderTable.editing)
[self.navigationItem.rightBarButtonItem setTitle:@"Done"];
else
{
[self.navigationItem.rightBarButtonItem setTitle:@"Delete"];
}
}
-(void)tableView:(UITableView*)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath*)indexPath
{
NSUInteger row = [indexPath row];
[tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath]
withRowAnimation:UITableViewRowAnimationFade];
}
Однако я получаю следующее исключение при попытке нажать кнопку удаления:
Ошибка подтверждения в -[UITableView _endCellAnimationsWithContext:], /SourceCache/UIKit_Sim/UIKit-1448.89/UITableView.m:995
Завершение работы приложения из-за необработанного исключения "NSInternalInconsistencyException", причина: "Недопустимое обновление: недопустимое количество строк в разделе 1. Число строк, содержащихся в существующем разделе после обновления (1), должно быть равно количеству строк, содержащихся в этом раздел до обновления (1), плюс или минус количество строк, вставленных или удаленных из этого раздела (0 вставлено, 1 удалено).'
*** Call stack at first throw:
(
0 CoreFoundation 0x010305a9 __exceptionPreprocess + 185
1 libobjc.A.dylib 0x01184313 objc_exception_throw + 44
2 CoreFoundation 0x00fe8ef8
+[NSException raise:format:arguments:] + 136
3 Foundation 0x001153bb -
[NSAssertionHandler handleFailureInMethod:object:file:lineNumber:description:] + 116
4 UIKit 0x00398e8b -[UITableView(_UITableViewPrivate) _endCellAnimationsWithContext:] + 8420
5 UIKit 0x00387cf8 -
[UITableView deleteRowsAtIndexPaths:withRowAnimation:] + 56
6 Restaurant 0x000117f9 -
[MyOrderViewController tableView:commitEditingStyle:forRowAtIndexPath:] + 114
7 UIKit 0x00385037 -[UITableView(UITableViewInternal) animateDeletionOfRowWithCell:] + 101
8 UIKit 0x0031a4fd -[UIApplication sendAction:to:from:forEvent:] + 119
9 UIKit 0x003aa799 -[UIControl sendAction:to:forEvent:] + 67
10 UIKit 0x003acc2b -[UIControl(Internal) _sendActionsForEvents:withEvent:] + 527
11 UIKit 0x003ab7d8 -[UIControl touchesEnded:withEvent:] + 458
.............
..........
.............
)
terminate called after throwing an instance of 'NSException'
Где я могу начать решать эту проблему?
3 ответа
"Количество строк, содержащихся в существующем разделе после обновления (1), должно быть равно количеству строк, содержащихся в этом разделе до обновления (1), плюс или минус количество строк, вставленных или удаленных из этого раздела (0 вставлено, 1 удалено). "
Ошибка ясно говорит, что не так. Я бы осмотрел твои numberOfRowsInSection
метод. Вы должны учитывать, что строка удаляется. Вы не можете всегда возвращать одинаковое количество строк. Если вы удаляете одну строку из таблицы, ваш numberOfRowsInSection должен возвращать свое старое возвращаемое значение минус 1.
Например:
Допустим, я использую массив строк для заполнения таблицы;
Мой метод numberOfRowsInSection будет использовать
return [array count];
Мой метод cellForRowAtIndexPath будет использовать
cell.textLabel.text = (NSString*)[array objectAtIndex:indexPath.row];
Когда я удаляю строку (скажем, номер строки 3) из tableView, я также удаляю объект из массива:
[array removeObjectAtIndex:3];
Таким образом, когда numberOfRowsInSection вызывается снова, массив на один объект меньше, а numberOfRowsInSection возвращает на одно число меньше, чем раньше, что объясняет удаленную строку.
Вы прочитали сообщение об ошибке? Это говорит:
причина: "Неверное обновление: неверное количество строк в разделе 1.
Итак... количество строк в вашем tableView теперь неверно. Зачем?
Количество строк, содержащихся в существующем разделе после обновления (1), должно быть равно количеству строк, содержащихся в этом разделе до обновления (1), плюс или минус количество строк, вставленных или удаленных из этого раздела (0 вставлено, 1 удалено).
Когда вы удаляете строку из tableView, вы также должны удалить соответствующий объект из массива объектов, которые отображаются в tableView. Ты этого не делал. Таким образом, UITableView
бросил исключение.
Вы удаляете элемент из своего источника данных в commitEditingStyle:? Если источник данных таблицы имеет 2 элемента, и вы удаляете строку в commitEditingStyle: вам также следует удалить элемент из вашего источника данных, чтобы теперь и у таблицы, и у источника данных был 1 элемент.