iOS UITableView“'尝试为单元格创建两个动画'”

时间:2011-06-22 10:48:32

标签: ios uitableview core-animation

我有一个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

6 个答案:

答案 0 :(得分:55)

对于再次遇到这种情况的任何人,请确保在传递给reload,delete或insertRowsAtIndexPaths的数组中没有重复的indexPath。

答案 1 :(得分:2)

很难理解你是如何导致该错误消息的,但是尝试将表重新加载代码移动到一个单独的方法中,并在现在拥有两个相同代码块的地方调用它。这可能会解决UITableView本来应该过滤掉的某种奇怪的竞争条件。

答案 2 :(得分:2)

假设self.arTableData是一个可变数组的表& tableViewUITableView的一个实例。假设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];
}

如果您想要多行删除,请尝试逐行删除行&amp;不是一次全部。 删除多行(包括动画)可能会导致崩溃。

但是在插入行时,可以将整个数组传递给插入&amp; UITableView肯定会执行动画。

这个技巧对我没有任何麻烦。希望它对你有用。祝你好运。

答案 3 :(得分:1)

我通过告诉tableview两次reloadSection来得到此错误。

答案 4 :(得分:0)

我试图在一个部分中删除索引为-1的行。

答案 5 :(得分:0)

在我的情况下,我有一个餐馆的桌面视图,他们与用户的当前位置的距离。距离将在收到新用户位置时更新。这会导致细胞在某些时刻更新。如果用户重新排序,则细胞恰好与正在更新细胞的时间相同。一个单元格将从两个位置进行操作。这导致程序崩溃。所以我只是检查它是否是编辑模式,不要更新距离。我希望这可能有所帮助。这是@jjramos

答案的一个特定条件