好吧,我不知道这是否只是不礼貌,但我觉得我会在这里回答我自己的问题。
首先,感谢所有其他答案,当然你们都是正确的,但没有一个答案能解决我的问题。
事实证明,代码中有另一个区域执行不同的检查,然后调用其中一个 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。
(它必须返回正确的行,具体取决于您是否展开。)