UITableView崩溃,因为“尝试为单元格创建两个动画”(iOS 7)

时间:2014-06-29 18:09:56

标签: ios objective-c uitableview animation

在UITableView中,我试图交换两个部分的位置,并使用批量更新向其中一个部分添加新行。

在:

+-------------------------------------+
|                                     |
|                                     |
| SECTION A - HEADER - TITLE          |
|-------------------------------------|
| SECTION A - ROW X                   |
|-------------------------------------|
| SECTION A - ROW Y                 > |
|-------------------------------------|
|                                     |
|                                     |
|-------------------------------------|
| SECTION B - ROW X                   |
|-------------------------------------|
|                                     |
|                                     |
+-------------------------------------+

在:

+-------------------------------------+
|                                     |
|                                     |
|-------------------------------------|
| SECTION B - ROW X                   |
|-------------------------------------|
|                                     |
|                                     |
| SECTION A - HEADER - TITLE          |
|-------------------------------------|
| SECTION A - ROW X                   |
|-------------------------------------|
| SECTION A - ROW Z - NEW ROW         | <---------
|-------------------------------------|
| SECTION A - ROW Y                 > |
|-------------------------------------|
|                                     |
|                                     |
+-------------------------------------+

这是我的代码:

[self.tableView beginUpdates];
[self.tableView moveSection:from toSection:to]; // from: 0, to: 1
[self.tableView insertRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationAutomatic]; // indexPath.section: 1, indexPath.row: 1
[self.tableView endUpdates];

但是UITableView实例崩溃并输出以下内容:

2014-06-29 19:45:07.486 YouTube[3312:60b] *** Assertion failure in -[_UITableViewUpdateSupport _setupAnimationsForNewlyInsertedCells], /SourceCache/UIKit_Sim/UIKit-2935.137/UITableViewSupport.m:1173
2014-06-29 19:45:07.488 YouTube[3312:60b] *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Attempt to create two animations for cell'
*** First throw call stack:
(
    0   CoreFoundation                      0x0000000102447495 __exceptionPreprocess + 165
    1   libobjc.A.dylib                     0x00000001021a699e objc_exception_throw + 43
    2   CoreFoundation                      0x000000010244731a +[NSException raise:format:arguments:] + 106
    3   Foundation                          0x0000000101d42f19 -[NSAssertionHandler handleFailureInMethod:object:file:lineNumber:description:] + 189
    4   UIKit                               0x000000010101166c -[_UITableViewUpdateSupport(Private) _setupAnimationsForNewlyInsertedCells] + 7491
    5   UIKit                               0x000000010101aa81 -[_UITableViewUpdateSupport _setupAnimations] + 193
    6   UIKit                               0x0000000100e10615 -[UITableView _updateWithItems:updateSupport:] + 1639
    7   UIKit                               0x0000000100e0c000 -[UITableView _endCellAnimationsWithContext:] + 11615
    ...

是否无法在批量更新中同时移动某个部分并添加新行?

2 个答案:

答案 0 :(得分:0)

您也应该更改dataSource。

- (void)exchangeTableSection
{
        [self.tableView beginUpdates];

        NSMutableArray *temp = self.data1;
        self.data1 = self.data2;
        self.data2 = temp;
        [self.data1 insertObject:@"ROW Z - NEW ROW " atIndex:1];

        [self.tableView moveSection:0 toSection:1];
        [self.tableView insertRowsAtIndexPaths:@[[NSIndexPath indexPathForRow:1 inSection:0]] withRowAnimation:UITableViewRowAnimationAutomatic];

        [self.tableView endUpdates];
}

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
        return 2;
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
        if (0 == section) {
                return self.data1.count;
        } else if (1 == section) {
                return self.data2.count;
        }
        return 0;
}

答案 1 :(得分:0)

我知道这是一个老问题,但是我自己在iOS 11.3上就遇到了这个问题。我们具有区分旧模型和新模型并生成UITableView更新的代码,并且当同时移动部分对其单元格进行任何更改(插入时,它会爆炸“单元格有多个动画”异常) / delete / update)。

在这种情况下,唯一的解决方案是删除/插入节,而不是移动。您可以始终执行此操作(并且可能进行次优动画处理),也可以执行我们的操作并跟踪细胞何时发生变化,并仅在安全时进行移动。