"A2")-6ren">
gpt4 book ai didi

ios - UITableView 在 'Attempt to create two animations for cell' 中的同一批更新结果中重新加载和移动行

转载 作者:可可西里 更新时间:2023-11-01 05:52:58 59 4
gpt4 key购买 nike

这是一个简单的例子(基本上是从“Master-Detail”Xcode 模板制作的)。

我试图在 UITableView 的批量更新中移动一行 ("B") 并重新加载另一行 ("A1"-> "A2")。

- (void)awakeFromNib
{
[super awakeFromNib];
self.objects = @[@"B", @"A1"];
}

- (IBAction)boom
{
self.objects = @[@"A2", @"B"];

NSIndexPath *path0 = [NSIndexPath indexPathForRow:0 inSection:0];
NSIndexPath *path1 = [NSIndexPath indexPathForRow:1 inSection:0];

[self.tableView beginUpdates];
[self.tableView reloadRowsAtIndexPaths:@[path1] withRowAnimation:UITableViewRowAnimationAutomatic];
[self.tableView moveRowAtIndexPath:path0 toIndexPath:path1];
[self.tableView endUpdates];
}

这会导致以下异常:

2015-01-14 17:58:51.290 batchtest[34004:806671] *** Assertion failure in -[_UITableViewUpdateSupport _setupAnimationsForNewlyInsertedCells], /SourceCache/UIKit_Sim/UIKit-3318.16.14/UITableViewSupport.m:1216
2015-01-14 17:58:51.335 batchtest[34004:806671] *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Attempt to create two animations for cell'
*** First throw call stack:
(
0 CoreFoundation 0x00946946 __exceptionPreprocess + 182
1 libobjc.A.dylib 0x005cfa97 objc_exception_throw + 44
2 CoreFoundation 0x009467da +[NSException raise:format:arguments:] + 138
3 Foundation 0x00243810 -[NSAssertionHandler handleFailureInMethod:object:file:lineNumber:description:] + 118
4 UIKit 0x010b18e5 -[_UITableViewUpdateSupport(Private) _setupAnimationsForNewlyInsertedCells] + 8447
5 UIKit 0x010bb422 -[_UITableViewUpdateSupport _setupAnimations] + 207
6 UIKit 0x00df8bc1 -[UITableView _updateWithItems:updateSupport:] + 2089
7 UIKit 0x00df24a8 -[UITableView _endCellAnimationsWithContext:] + 13867
8 UIKit 0x00e07b6f -[UITableView endUpdatesWithContext:] + 51
9 UIKit 0x00e07b9d -[UITableView endUpdates] + 41

当我尝试将 @[path0] 传递给 reloadRowsAtIndexPaths 而不是 @[path1] 时,同样的事情发生了。

在我看来,这像是一个 iOS 错误。有办法解决吗?我做错了什么吗?

最佳答案

在我看来,这个异常没有任何问题。 reloadRowsAtIndexPaths:withRowAnimation: 为正在重新加载的行创建动画,moveRowAtIndexPath:toIndexPath: 也创建动画。显然,UITableView 无法同时处理 2 个动画并抛出异常。

我想将 UITableViewRowAnimationNone 传递给 reloadRowsAtIndexPaths:withRowAnimation: 可以解决问题但不确定;仍然值得一试。

我会提出这样的解决方法:

[self.tableView moveRowAtIndexPath:path0 toIndexPath:path1];
dispatch_async(dispatch_get_main_queue(), ^{
self.objects = @[@"A2", @"B"];
[self.tableView reloadRowsAtIndexPaths:@[path1]
withRowAnimation:UITableViewRowAnimationAutomatic];
});

或者这个:

[CATransaction begin];
[CATransaction setCompletionBlock:^{
self.objects = @[@"A2", @"B"];
[self.tableView reloadRowsAtIndexPaths:@[path1]
withRowAnimation:UITableViewRowAnimationAutomatic];
}];
[self.tableView moveRowAtIndexPath:path0 toIndexPath:path1];
[CATransaction commit];

或者这个:

[UIView animateWithDuration:0.2 animations:^{
[self.tableView moveRowAtIndexPath:path0 toIndexPath:path1];
} completion:^(BOOL finished){
self.objects = @[@"A2", @"B"];
[self.tableView reloadRowsAtIndexPaths:@[path1]
withRowAnimation:UITableViewRowAnimationAutomatic];
}];

关于ios - UITableView 在 'Attempt to create two animations for cell' 中的同一批更新结果中重新加载和移动行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27942659/

59 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com