我有一个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发布于 2013-06-04 22:54:40
对于再次遇到这种情况的任何人,请确保传递给reload、delete或insertRowsAtIndexPaths的数组中没有重复的indexPaths。
发布于 2011-06-27 00:55:37
很难理解您是如何导致该错误消息,但请尝试将表重载代码移动到一个单独的方法中,并在您现在有两个相同的代码块的地方调用该方法。这可能会修复似乎是某种奇怪的竞争条件,而UITableView无论如何都应该自己过滤掉。
发布于 2011-07-20 13:15:57
假设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];
}如果您想要删除多个行,请尝试逐个删除行&而不是一次删除所有行。删除多行(包括动画)可能会导致崩溃。
但是当您插入行时,您可以将整个数组传递给insert & UITableView肯定会执行动画。
这个技巧对我很有效,没有任何麻烦。希望它同样适用于你。祝你好运。
https://stackoverflow.com/questions/6438606
复制相似问题