3

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

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

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

我的问题是,我已经像上面那样尝试过,并且尝试过不使用 animateWithDuration。我什至尝试过使用 CATransaction,但是无论我怎么做,动画都不会发生。

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

我已经在 SO 和 Google 上进行了搜索,但似乎找不到答案。有任何想法吗?

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

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

4

4 回答 4

7

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

像这样试试

-(void)removeItem:(NSIndexPath *)indexPath {
    [self.tableView beginUpdates];
    [self.tableView deleteRowsAtIndexPaths:@[indexPath]
                  withRowAnimation:UITableViewRowAnimationRight];
    [self.tableView endUpdates];
}
于 2013-08-20T13:30:29.323 回答
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。

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

于 2013-08-21T11:47:15.360 回答
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];
}
于 2013-08-20T13:35:01.633 回答
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];
于 2016-02-02T10:36:30.443 回答