gpt4 book ai didi

ios - 如何从 UICollectionView performBatchUpdates : 中的断言失败中优雅地恢复

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:08:16 34 4
gpt4 key购买 nike

我有一个像这样更新的 UICollectionView:

[self.collectionView performBatchUpdates:^{
[self.collectionView deleteItemsAtIndexPaths:pathsRemoved];
[self.collectionView insertItemsAtIndexPaths:pathsAdded];
}

通常,这工作得很好,但在某些情况下,数据源计数与原始项目数不匹配 - pathsRemoved 的计数 + pathsAdded 的计数。

因此,我将这段代码包装在一个 @try/@catch block 中,然后调用 [self.collectionView reloadData]。

然而,最终发生的是,在重新加载数据后,布局变得困惑;以前存在的单元格(在屏幕上的单元格上方,但在屏幕外)不再显示。 Collection View 的内容大小正确,我可以上下滚动,但只能看到重新加载时屏幕上的单元格。

有趣的是,Reveal.app 显示其他单元格确实存在,但被隐藏了;我有一种预感,这是一个转移注意力的问题,这里进行了一些 View 缓存,但这些单元格仍然列在 Reveal 中。

我已经尝试使布局无效,调用 layoutIfNeeded,以及我发现的各种流布局子类技巧,但没有任何解决办法。

我已采取自己的良性断言来缓解问题,并进行检查以确保计数相加。如果他们这样做,请执行 BatchUpdates。否则,不要打扰,只需重新加载即可。这是可行的,因为我们完全绕过了 performBatchUpdates:。但我不得不问:

是否有更好的方法从 performBatchUpdates: 中抛出的断言异常中优雅地恢复?还是 UICollectionViews 只是有问题(仍然是在 iOS 7 上)。

最佳答案

我只是想办法解决这个问题!

我试过像您一样将 performBatchUpdates: 代码包装在调用 [collectionView reloadData] 的 @try/@catch block 中。

然后我意识到当我的 ViewController 被释放时问题就消失了,collectionView 也是。

所以我找到了丑陋的解决方案(但有效):杀死旧的 collectionView 并在 catch block 中创建一个新的。

@try {
[collectionView performBatchUpdates:^ {
// Do your stuff
}];

}
@catch (NSException *exception) {
UIView *oldSuperview = self.collectionView.superview;

[self.collectionView removeFromSuperview];

self.collectionView = [[UICollectionView alloc] initWithFrame:self.collectionView.frame collectionViewLayout:self.collectionView.collectionViewLayout];

self.collectionView.dataSource = self;
self.collectionView.delegate = self;
// set other collectionView's properties here

[oldSuperview addSubview:self.collectionView];
}

我知道这很糟糕,但它救了我!

关于ios - 如何从 UICollectionView performBatchUpdates : 中的断言失败中优雅地恢复,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21300559/

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