59 votes

Disparition de la cellule de UICollectionView

Ce qui se passe

Actuellement, j'ai une application qui utilise deux UICollectionViews à l'intérieur d'un UITableView . De cette façon, je crée une application ressemblant à Pulse News. Mon problème est que parfois la 6ème et la 11ème ligne disparaissent complètement, laissant un espace vide là où devrait se trouver la cellule. Cela ne me dérangerait pas vraiment si toutes les cellules étaient comme ça (et ainsi je pourrais supposer que je ne fais pas les choses correctement), mais le problème est que cela ne se produit qu'avec ces cellules spécifiques.

Ma théorie

Les 6e et 11e rangées sont celles qui apparaissent lorsque je commence à défiler, donc par défaut je suis capable de voir 5 cellules, et lorsque je fais le premier défilement horizontal, la 6e apparaît (espace vide parfois).

Ce que j'ai

La seule chose que je fais en ce moment est ceci :

 [self.collectionView registerNib:[UINib nibWithNibName:CELL_NIB_NAME bundle:nil] forCellWithReuseIdentifier:CELL_IDENTIFIER];

Sur le viewDidLoad . Et sur la création de la cellule :

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
{
    MyCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:CELL_IDENTIFIER forIndexPath:indexPath];

    NSMutableDictionary *dictionary = [self.DataSource objectAtIndex:[indexPath row]];

    [cell buildViewWithDictionary:dictionary withReferenceParent:self.referenceViewController];

    return cell;
}

Donc, pour résumer, il n'y a rien d'extraordinaire ici. Je pensais qu'il y avait un problème avec la source de données (un fichier JSON factice), mais parfois cela fonctionne bien et la cellule s'affiche, donc je suppose que cette partie est correcte.

Donc ma "question" : Quelqu'un sait-il ce qui se passe ? Je n'aime pas vraiment dire que c'est un bug d'iOS, mais je ne vois rien d'autre.


Edit 1.0

La partie étonnante est que cette méthode

-(UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath;

Est-ce que passer de indexPath [0,4] à [0,6] sans calculer le [0,5]. C'est la première fois que je vois cela se produire dans iOS.


Edit 2.0

J'ai changé la façon dont je crée les cellules, et au lieu de mettre en file d'attente, j'utilise l'ancienne méthode :

NSArray *nib = [[NSBundle mainBundle] loadNibNamed:CELL_NIB_NAME owner:self options:nil];
MyCell *cell = (MyCell *)[nib objectAtIndex:0];

Toujours le même triste résultat.

0 votes

J'obtiens le même problème, mais les cellules qui disparaissent finissent par être rendues en dessous de la cellule précédente ! C'est très étrange. J'ai supposé que c'était un bug dans iOS.

0 votes

Des choses étranges se passent. =/ Mais toujours un contrôleur exceptionnel

0 votes

J'ai une vue de grille classique créée à l'aide d'une vue de collection. J'ai 3 cellules dans une rangée avec de petits espaces. La même chose se produit ici, mais de façon très aléatoire. De temps en temps, une cellule est placée à la quatrième place dans une rangée et à la place attendue, il n'y a rien.

-1voto

lambert.lu Points 1

Je pense que ce n'est pas un bug de UICollectionView, peut-être que vous ne retournez pas les bonnes données dans le fichier - (NSArray *)layoutAttributesForElementsInRect:(CGRect)rect méthode.

Vous pouvez voir cette démo : https://github.com/lqcjdx/YLTagsChooser toutes les cellules peuvent apparaître lorsque l'on scrute le UICollectionView.

-1voto

Hopsa Points 46

Dans mon cas, le problème de disparition de la cellule était dû aux éléments suivants IQKeyboardManager SDK ajouté dans le projet. En effet, ce SDK déclenche l'animation du clavier dans tout le projet, même si vous ne l'ajoutez pas directement au fichier séparé.

Ce qui est étrange pour moi, c'est que le problème ne se produit que lorsque vous ajoutez UIEdgeInset pour la vue de la collection avec dans mon cas plus de 40 de .bottom.

Comment le réparer ? Vous devez déverrouiller le fichier pod et ajouter

DispatchQueue.main.async {}

pour cette animation. Dans le cas de UICollectionViewController, elle se trouve à l'intérieur de

@objc internal func keyboardWillHide(_ notification: Notification?) {}

méthode avec ligne

 if let lastScrollView = lastScrollView {}

Lorsque vous ajoutez la file d'attente principale pour cette animation, le problème disparaît.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X