Подтвердить что ты не робот

IOS UITableView "Попытка создать две анимации для ячейки"

У меня есть ячейка 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
4b9b3361

Ответ 1

Чтобы кто-нибудь снова встретил эту ситуацию, убедитесь, что в массиве, который передается для перезагрузки, удаления или insertRowsAtIndexPaths, не повторяются indexPaths.

Ответ 2

Трудно понять, как вы вызываете это сообщение об ошибке, но попробуйте переместить код перезагрузки таблицы в отдельный метод и назовите это, когда у вас есть два одинаковых блока кода. Это может исправить то, что кажется каким-то странным состоянием гонки, которое UITableView должно отфильтровывать самостоятельно в любом случае.

Ответ 3

Предположим, что 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, безусловно, будет выполнять анимацию.

Этот трюк работает для меня без каких-либо неприятностей. Надеюсь, что это сработает для вас. Удачи.

Ответ 4

Я получил это для попытки удалить строку с индексом -1 в разделе.

Ответ 5

В моем случае у меня есть табличный вид ресторанов с их расстоянием до текущего местоположения пользователя. Расстояние будет обновляться, когда оно получит новое местоположение пользователя. Это заставляет клетки обновляться в определенные моменты. Если пользователь переупорядочивает ячейки, то они будут совпадать с обновлением ячеек. одна ячейка будет манипулировать с двух позиций. Это вызвало сбой программы. Поэтому я просто проверяю, является ли это режимом редактирования, не обновляйте расстояние. Надеюсь, это поможет. Это одно конкретное условие ответа от @jjramos