2011-06-22 64 views
26

我有一个customTableView单元格 - 我想只更新单元格(基于网络事件发生)。iOS UITableView“'试图为单元格创建两个动画'”

所以,当我第一次做网络电话我做的:

- (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 

回答

2

很难理解你是如何导致该错误消息,但请尝试移动台重载代码放到一个单独的方法,并调用在那里你现在有两个相同的代码块。这可能会解决似乎是某种奇怪的竞争条件,UITableView应该自行过滤掉。

+0

请参阅下面的@jjramos回复。这可能不像看起来那么不那么令人费解。 – clearlight

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]; 
} 

如果你想多行删除,试图通过一个&不是一次全部删除行之一。 删除多行(包括动画)可能会导致崩溃。

但是当你插入行时,你可以传递整个数组来插入& UITableView肯定会执行动画。

那个技巧对我来说没有任何麻烦。希望它对你有同样的作用。祝你好运。

+1

为我工作,谢谢! –

+0

@Spark如果你在循环之前加入[self.arTableData beginUpdates],然后在[self.arTableData endUpdates]之后,它会把所有的删除操作批量化为一个动画 – imnk

54

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

+0

完美,谢谢! –

+0

很好的回复!让我省去了很多浪费时间调查切线,而错过了相对明显的。国际海事组织,苹果应改善错误信息文本,以包括你的提示。 – clearlight

+0

我没有重复的路径,但部分错误的数字(导致该部分被设置为'(NSUInteger)-1'的错误)。无论如何,您的回答指向我的解决方案,谢谢。 –

0

我得到这个尝试删除索引-1在一节中的行。

0

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

相关问题