如何解决这个CollectionView崩溃?

Spa*_*Dog 11 iphone ios uicollectionview performbatchupdates

我的应用程序有两个CollectionViewController.在给定时间只能看到一个.

我在故事板上创建了以下结构:两个容器视图相互叠加.每个容器视图都有一个CollectionViewController嵌入式.特定容器视图的可见性确定哪个collectionViewController可见.

这就是问题.两者CollectionViewController都是并行接收数据,但iOS有一个错误,如果一个CollectionViewController performBatchUpdates在不可见的情况下尝试执行插入操作时会导致应用程序崩溃.

为了防止这种情况,我在两个CollectionViewControllers 上创建了一个BOOL标志,这样他们就可以知道它们是否可见并且是否可以执行performBatchUpdates.就像是:

if (self.isThisCollectionViewVisible == NO) return;

[self.collectionView performBatchUpdates:^{
   // bla bla... perform insert,m remove...
Run Code Online (Sandbox Code Playgroud)

这解决了部分问题.但是应用程序继续在以下情况下崩溃:如果我点击按钮切换到不CollectionViewController可见,使其在接收更新时可见.

我的意思是:让我们打电话A给第一个CollectionViewControllerB第二个.A是可见的,此时B是不可见的.B开始接收数据,并试图做一个,performBatchUpdates但因为它是不可见的,这if (self.isThisCollectionViewVisible == NO) return;是阻止performBatchUpdates运行,什么是好的.现在我变得A隐形和B可见.此时标志self.isThisCollectionViewVisible设置为YESperformBatchUpdates使得与此错误的应用程序崩溃:

*断言失败 - [CollectionView _endItemAnimationsWithInvalidationContext:tentativelyForReordering:],/ BuildRoot/Library/Cache/com.apple.xbs/Source/UIKit/UIKit-3512.60.7/UICollectionView.m:4625*由于未捕获的异常而终止应用程序'NSInternalInconsistencyException ',原因:'无效更新:第0部分中的项目数无效.更新后现有部分中包含的项目数(76)必须等于更新前该部分中包含的项目数(70),加上或减去从该部分插入或删除的项目数(插入5个,删除2个),加上或减去移入或移出该部分的项目数(0移入,0移出).

我认为它还CollectionViewController没有准备好并且已经更新以便能够执行performBatchUpdates...而这不是以前不更新数据源的问题,因为它正在更新.

我可以做些什么来防止这种情况发生?

注意:我特别注意到这次崩溃的一些奇怪之处.它说插入了5个元素,删除了2个,但实际上插入了3个元素,0个删除,2个崩溃发生时更改.

Joã*_*nes 17

对我来说,self.collectionView.numberOfItemsInSection(0)修复了崩溃.在项目不可见时插入项目时,collectionView会出现问题.

好像我并不孤单,我的解决方案:http://www.openradar.me/15262692

  • 你能说明插入这条魔术线的位置吗?我在实际更新之前尝试过它并没有什么区别 (4认同)