web-dev-qa-db-fra.com

Échec d'assertion dans UICollectionViewData validateLayoutInRect sur ios7

Échec d'assertion dans UICollectionViewDatavalidateLayoutInRect sur iOS7.

J'essaie de supprimer tous les éléments UICollectionView, un par un, à l'aide d'une boucle for; J'ai posté mon code ci-dessous. Je supprime les éléments UICollectionView en utilisant deleteItemsAtIndexPaths. C'est fonctionne parfaitement sur iOS6 , mais se bloque sous iOS7 avec cette exception:

Échec d'assertion dans UICollectionViewData validateLayoutInRect

Je supprime l'objet de collectionArray puis self.collectionView, un par un, en utilisant indexPath. Lorsque je supprime le 4ème objet, il déclenche Assertion failure sur iOS7. Ici, j'utilise performBatchUpdates.

S'il vous plaît aidez-moi à obtenir le résultat approprié dans iOS7. Partagez le code approprié. Merci d'avance.

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 {
}
20
user1888996

J'ai eu ce plantage une fois, non pas parce que je renvoyais zéro pour un certain nombre de sections ou d'éléments d'une section, mais parce que je réutilisais une présentation de flux comme celle-ci pour plus d'une vue de collection:

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

Au lieu de cela, si je crée une nouvelle disposition de flux pour chaque UICollectionView, j'évite cet incident. Espérons que cela pourrait aider quelqu'un

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];
24
ColossalChris

sous iOS 10, vous devez désactiver le prefetchingEnabled:

// Swift
if #available(iOS 10, *) { 
    collectionView.prefetchingEnabled = false 
}

//Obj C
if ([self.collectionView respondsToSelector:@selector(setPrefetchingEnabled:)]) {
    self.collectionView.prefetchingEnabled = false;
}
19
dang

Il semblerait que vous souhaitiez probablement faire ceci:

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

Pour que toutes les mises à jour soient effectuées ensemble. Sinon, vous finirez par essayer de réaliser plusieurs lots de mises à jour par lots les uns sur les autres.

3
James Snook

layout lifecycle

Vous devez implémenter invalidateLayout dans votre layoutClass et supprimer toutes sortes d’éléments UICollectionViewLayoutAttributes dans votre configuration.

- (void)invalidateLayout{
  [super invalidateLayout];
  [self.itemsAttributes removeAllObjects];
}
3
Zev003

essayez d'appeler [yourCollectionView.collectionViewLayout invalidateLayout];

0
Aks

Vous devez implémenter invalidateLayout dans votre classe de présentation et supprimer toutes sortes d'éléments UICollectionViewLayoutAttributes dans votre configuration.

- (void)invalidateLayout{
  [super invalidateLayout];
  [self.itemsAttributes removeAllObjects];
}

Pour une meilleure façon de mettre en œuvre invalidateLayoutWithContext, voir plus à propos de UICollectionViewLayoutInvalidationContext.

Depuis Documentation Apple Developer :

Lors de l'implémentation d'une présentation personnalisée, vous pouvez remplacer cette méthode et utiliser Pour traiter les informations fournies par un contexte d'invalidation personnalisé. Vous n'êtes pas obligé de fournir un contexte d'invalidation personnalisé, mais vous pouvez le faire Si vous êtes en mesure de fournir des propriétés supplémentaires qui peuvent aider À optimiser les mises à jour de la présentation. Si vous substituez cette méthode, vous devez appeler Super à un moment donné de votre implémentation.

0
Zev003

Dans mon cas, le délégué suivant était manquant:

func numberOfSections(in collectionView: UICollectionView) -> Int {
        return 1
    }
0
Venu Gopal Tewari