Ответ 1
Чтобы кто-нибудь снова встретил эту ситуацию, убедитесь, что в массиве, который передается для перезагрузки, удаления или insertRowsAtIndexPaths, не повторяются indexPaths.
У меня есть ячейка customTableView - я хочу просто обновить ячейку (на основе события сети).
Итак, когда я сначала делаю сетевой вызов, я делаю:
- (void)makeNetworkCall
{
[self.tableView beginUpdates];
// MAKE_NETWORK_CALL
[self.tableView reloadRowsAtIndexPaths:[NSArray arrayWithObject:indexPath]
withRowAnimation:UITableViewRowAnimationNone];
[self.tableView endUpdates]; // SIGABRT OCCURS HERE ON SECOND CALL
}
- (void)networkDataReturned:(NSDictionary*)dataReturned
{
// UPDATE_TABLE_VIEW_DATA_MODEL
[self.tableView reloadRowsAtIndexPaths:[NSArray arrayWithObject:indexPath]
withRowAnimation:UITableViewRowAnimationNone];
}
Это работает в первый раз, когда вызывается сетевое событие, однако, если ячейка прослушивается (тем самым снова вызывая сетевое событие, результат которого теперь кэширован), я получаю следующую ошибку:
2011-06-22 11:19:11.262 App[3991:707] *** Assertion failure in -[_UITableViewUpdateSupport _setupAnimationsForExistingVisibleCells], /SourceCache/UIKit/UIKit-1448.89/UITableViewSupport.m:288
2011-06-22 11:19:11.327 App[3991:707] *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Attempt to create two animations for cell'
*** Call stack at first throw:
(
0 CoreFoundation 0x32c7664f __exceptionPreprocess + 114
1 libobjc.A.dylib 0x36eb9c5d objc_exception_throw + 24
2 CoreFoundation 0x32c76491 +[NSException raise:format:arguments:] + 68
3 Foundation 0x32894573 -[NSAssertionHandler handleFailureInMethod:object:file:lineNumber:description:] + 62
4 UIKit 0x35f59d3b -[_UITableViewUpdateSupport(Private) _setupAnimationsForExistingVisibleCells] + 402
5 UIKit 0x35f58b81 -[_UITableViewUpdateSupport initWithTableView:updateItems:oldRowData:newRowData:oldRowRange:newRowRange:context:] + 296
6 UIKit 0x35f57dc1 -[UITableView(_UITableViewPrivate) _updateWithItems:withOldRowData:oldRowRange:newRowRange:context:] + 972
7 UIKit 0x35f57473 -[UITableView(_UITableViewPrivate) _endCellAnimationsWithContext:] + 4750
8 UIKit 0x35f612f9 -[UITableView endUpdatesWithContext:] + 28
9 UIKit 0x35f612d5 -[UITableView endUpdates] + 16
10 App 0x0005a033 -[CustomTableViewController tableView:didSelectRowAtIndexPath:] + 574
Чтобы кто-нибудь снова встретил эту ситуацию, убедитесь, что в массиве, который передается для перезагрузки, удаления или insertRowsAtIndexPaths, не повторяются indexPaths.
Трудно понять, как вы вызываете это сообщение об ошибке, но попробуйте переместить код перезагрузки таблицы в отдельный метод и назовите это, когда у вас есть два одинаковых блока кода. Это может исправить то, что кажется каким-то странным состоянием гонки, которое UITableView
должно отфильтровывать самостоятельно в любом случае.
Предположим, что self.arTableData
является изменяемым массивом таблицы, а tableView
является экземпляром UITableView
. Предположим, что в tableView
есть 10 строк (что означает 10 объектов в массиве).
Я реализую следующий код для удаления анимированных строк.
int i; // to remove from 3 to 6
for(i=2;i<6;i++)
{
[self.arTableData removeObjectAtIndex:i];
[tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:[NSIndexPath indexPathForRow:i inSection:0]] withRowAnimation:UITableViewRowAnimationRight];
}
Если вы хотите удалить несколько строк, попробуйте удалить строки один за другим, а не все сразу. Удаление нескольких строк (включая анимацию) может привести к сбою.
Но пока вы вставляете строки, вы можете передать весь массив для вставки, а UITableView, безусловно, будет выполнять анимацию.
Этот трюк работает для меня без каких-либо неприятностей. Надеюсь, что это сработает для вас. Удачи.
Я получил это для попытки удалить строку с индексом -1 в разделе.
В моем случае у меня есть табличный вид ресторанов с их расстоянием до текущего местоположения пользователя. Расстояние будет обновляться, когда оно получит новое местоположение пользователя. Это заставляет клетки обновляться в определенные моменты. Если пользователь переупорядочивает ячейки, то они будут совпадать с обновлением ячеек. одна ячейка будет манипулировать с двух позиций. Это вызвало сбой программы. Поэтому я просто проверяю, является ли это режимом редактирования, не обновляйте расстояние. Надеюсь, это поможет. Это одно конкретное условие ответа от @jjramos