21

iOS7でのアサーション エラーUICollectionViewData validateLayoutInRect

ループUICollectionViewを使用して、すべてのアイテムを 1 つずつ削除しようとしています。for以下にコードを投稿しました。UICollectionViewを使用してアイテムを削除しますdeleteItemsAtIndexPaths。iOS6では完全に動作しますが、iOS7では次の例外を除いてクラッシュします。

UICollectionViewData validateLayoutInRect でのアサーション エラー

collectionArrayを使用して、 thenからオブジェクトをself.collectionView1 つずつ削除しますindexPath。4 番目のオブジェクトを削除すると、Assertion failureiOS7 で発生します。ここでは を使用して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 {
}
4

8 に答える 8

24

実際にこのクラッシュが発生したのは、セクションまたはセクション内のアイテムの数に対してゼロを返していたからではなく、複数のコレクション ビューに対してこのようなフロー レイアウトを再利用していたからです。

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 ごとに新しいフロー レイアウトを作成すると、このクラッシュを回避できます。うまくいけば、それは誰かを助けるかもしれません

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];
于 2014-04-25T15:30:00.050 に答える
4

おそらくこれをやりたいようです:

[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];

すべての更新が一緒に実行されるようにします。そうしないと、複数のバッチ更新を重ねて実行しようとすることになります。

于 2014-08-06T08:51:53.307 に答える
2

電話してみる[yourCollectionView.collectionViewLayout invalidateLayout];

于 2016-06-28T18:51:49.317 に答える
0

私の場合、次のデリゲートがありませんでした:

func numberOfSections(in collectionView: UICollectionView) -> Int {
        return 1
    }
于 2017-11-14T19:18:21.790 に答える
-2
- (NSInteger)numberOfSectionsInCollectionView:(UICollectionView *)collectionView {
    [collectionView.collectionViewLayout invalidateLayout];
    return 1;
}
于 2016-07-18T03:46:21.417 に答える