iOS - 从UITableView删除行不动画

时间:2013-08-20 13:24:15

标签: objective-c ipad uitableview ios6.1

我有一个非常令人沮丧的问题。我有一个带UITableView的应用程序。 当我从表视图中删除一个单元格时,它将从数据模型中删除,然后我调用以下内容:

-(void)removeItem:(NSIndexPath *)indexPath {
    [self.tableView beginUpdates];

    [self.tableView deleteRowsAtIndexPaths:@[indexPath]
                      withRowAnimation:UITableViewRowAnimationRight];
    [self.tableView endUpdates];
}

我的问题是,我已经像上面那样尝试过,而且我已经尝试过不使用animateWithDuration了。我甚至尝试过CATransaction,但无论如何,动画都没有发生。

我的模拟器中的动画速度很慢,当我从列表中删除某个项目时,它会正确删除,但没有动画。 它只是消失,并在重新加载表视图数据之前留下空白片段。

我搜索了所有搜索引擎优化和谷歌,我似乎无法找到答案。 有什么想法吗?

是否可能与我在调用上述函数之前从数据模型中删除对象这一事实有关?

编辑:删除动画块,因为它不正确

4 个答案:

答案 0 :(得分:7)

根据THIS,您根本不需要使用animateWithDuration:animations:

试试这个

-(void)removeItem:(NSIndexPath *)indexPath {
    [self.tableView beginUpdates];
    [self.tableView deleteRowsAtIndexPaths:@[indexPath]
                  withRowAnimation:UITableViewRowAnimationRight];
    [self.tableView endUpdates];
}

答案 1 :(得分:3)

好吧,我不知道这是不礼貌,但我觉得我会在这里回答我自己的问题。

首先,感谢所有其他答案,当然你们都是正确的,但没有一个答案解决了我的问题。

事实证明,代码中还有另一个区域执行不同的检查,然后调用其中一个tableView委托方法,这似乎取消了动画。

所以答案如下:

当您正在删除行但动画无效时,请确保在动画开始之前未调用 didSelectRowAtIndexPath:indexPath 。这将取消动画。


如果你没有遇到这个问题,这里有一些非常典型的扩展代码,例子中有两行:

请注意,facebookRowsExpanded是您必须拥有的类变量:

if ( [theCommand isEqualToString:@"fbexpander"] )
{
NSLog(@"expander button......");
[tableView deselectRowAtIndexPath:indexPath animated:NO];

NSArray *deleteIndexPaths;
NSArray *insertIndexPaths;

facebookRowsExpanded = !facebookRowsExpanded;
// you must do that BEFORE, not AFTER the animation:

if ( !facebookRowsExpanded ) // ie, it was just true, is now false
    {
    deleteIndexPaths = [NSArray arrayWithObjects:
            [NSIndexPath indexPathForRow:2 inSection:0],
            [NSIndexPath indexPathForRow:3 inSection:0],
             nil];
    [tableView beginUpdates];
    [tableView
        deleteRowsAtIndexPaths:deleteIndexPaths
        withRowAnimation: UITableViewRowAnimationMiddle];
    [tableView endUpdates];
    }
else
    {
    insertIndexPaths = [NSArray arrayWithObjects:
            [NSIndexPath indexPathForRow:2 inSection:0],
            [NSIndexPath indexPathForRow:3 inSection:0],
             nil];
    [tableView beginUpdates];
    [tableView
        insertRowsAtIndexPaths:insertIndexPaths
        withRowAnimation: UITableViewRowAnimationMiddle];
    [tableView endUpdates];
    }

// DO NOT do this at the end: [_superTableView reloadData];
return;
}

注意: numberOfRowsInSection 的代码必须使用facebookRowsExpanded

(这将是“如果facebookRowsExpanded返回7,否则返回5”)

注意: cellForRowAtIndexPath 的代码必须使用facebookRowsExpanded。

(它必须返回正确的行,具体取决于您是否展开。)

答案 2 :(得分:2)

首先,您不需要自己动画更改。

其次,我认为您需要在开始和结束更新之间对数据源进行更改。

您的方法应如下所示:

-(void)removeItemAtIndexPath:(NSIndexPath *)indexPath{

    [self.tableView beginUpdates];

    // I am assuming that you're just using a plain NSMutableArray to drive the data on the table.

    // Delete the object from the datasource.
    [self.dataArray removeObjectAtIndex:indexPath.row];

    // Tell the table what has changed.
    [self.tableView deleteRowsAtIndexPaths:@[indexPath]
                  withRowAnimation:UITableViewRowAnimationRight];

    [self.tableView endUpdates];
}

答案 3 :(得分:1)

[self.tableView beginUpdates];
[self.tableView insertRowsAtIndexPaths:indexPaths withRowAnimation:UITableViewRowAnimationFade];
[self.tableView deleteRowsAtIndexPaths:indexPaths withRowAnimation:UITableViewRowAnimationFade];
[self.tableView endUpdates];

indexPaths是要在表中插入或删除的NSIndexPaths数组。

 NSarray *indexPaths = [[NSArray alloc] initWithObjects:
    [NSIndexPath indexPathForRow:0 inSection:0],
    [NSIndexPath indexPathForRow:1 inSection:0],
    [NSIndexPath indexPathForRow:2 inSection:0],
    nil];