UICollectionViewData在ios7上的validateLayoutInRect声明失败

UICollectionViewData上的UICollectionViewData validateLayoutInRect声明失败。

我试图删除所有的UICollectionView项目,一个接一个,使用for循环; 我在下面发布我的代码。 我使用deleteItemsAtIndexPaths删除了UICollectionView项目。 它在iOS6上完美工作 ,但在iOS7中崩溃 ,但有以下例外情况:

UICollectionViewData中的断言失败validateLayoutInRect

我从collectionArray删除对象,然后self.collectionView ,使用indexPath 。 当我删除第四个对象,在iOS7上引发Assertion failure 。 这里我使用了performBatchUpdates

请帮助我在iOS7中获得正确的结果。 分享正确的代码。 提前致谢。

 try { for (int i=count-1; i>=0; i--) { [self.collectionView performBatchUpdates:^(void){ [collectionArray removeObjectAtIndex:i]; // First delete the item from you model [self.collectionView deleteItemsAtIndexPaths:@[[NSIndexPath indexPathForRow:i inSection:0]]]; } completion:nil]; [self.collectionView reloadData]; } } @catch (NSException *exception) { } @finally { } 

我实际上得到了这个崩溃一次不是因为我在一个部分中的许多部分或项目返回零,但是因为我正在重复使用一个像这样的stream布局超过1个集合视图:

 UICollectionViewFlowLayout *flowLayout = [[UICollectionViewFlowLayout alloc] init]; [flowLayout setScrollDirection:UICollectionViewScrollDirectionHorizontal]; Collection1 = [[UICollectionView alloc] initWithFrame:CGRectMake(0.0f, 0.0f, 320.0f, 50.0f) collectionViewLayout:flowLayout]; [Collection1 setDataSource:self]; [Collection1 setDelegate:self]; [self.view addSubview:Collection1]; Collection2 = [[UICollectionView alloc] initWithFrame:CGRectMake(0.0f, 0.0f, 320.0f, self.view.frame.size.height) collectionViewLayout:flowLayout]; Collection2.backgroundColor = [UIColor whiteColor]; 

相反,如果我为每个UICollectionView创build一个新的stream布局,我会避免这个崩溃。 希望这可能有助于某人

 UICollectionViewFlowLayout *flowLayout = [[UICollectionViewFlowLayout alloc] init]; [flowLayout setScrollDirection:UICollectionViewScrollDirectionHorizontal]; Collection1 = [[UICollectionView alloc] initWithFrame:CGRectMake(0.0f, 0.0f, 320.0f, 50.0f) collectionViewLayout:flowLayout]; [Collection1 setDataSource:self]; [Collection1 setDelegate:self]; [self.view Collection1]; UICollectionViewFlowLayout *flowLayoutVert = [[UICollectionViewFlowLayout alloc] init]; [flowLayoutVert setScrollDirection:UICollectionViewScrollDirectionVertical]; Collection2 = [[UICollectionView alloc] initWithFrame:CGRectMake(0.0f, 0.0f, 320.0f, self.view.frame.size.height) collectionViewLayout:flowLayoutVert]; 

在iOS 10中,您必须禁用prefetchingEnabled:

 // Swift if #available(iOS 10, *) { collectionView.prefetchingEnabled = false } //Obj C if ([self.collectionView respondsToSelector:@selector(setPrefetchingEnabled:)]) { self.collectionView.prefetchingEnabled = false; } 

看起来你可能想这样做:

 [self.CollectionView performBatchUpdates:^(void) { for (int i = count - 1; i >= 0; i--) { [collectionArray removeObjectAtIndex:i]; // First delete the item from you model [self.CollectionView deleteItemsAtIndexPaths:@[[NSIndexPath indexPathForRow:i inSection:0]]]; } } completion:nil]; 

这样所有的更新一起执行。 否则,你将最终尝试执行几个批次更新在彼此的顶部。

尝试调用[yourCollectionView.collectionViewLayout invalidateLayout];

在我的情况下,代表失踪:

 func numberOfSections(in collectionView: UICollectionView) -> Int { return 1 } 
 - (NSInteger)numberOfSectionsInCollectionView:(UICollectionView *)collectionView { [collectionView.collectionViewLayout invalidateLayout]; return 1; }