IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Développement iOS Discussion :

Iteration sur une UICollectionView pour obtenir le contenu d'une cellule : comportement innatendu…


Sujet :

Développement iOS

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Inscrit en
    Janvier 2014
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Janvier 2014
    Messages : 4
    Points : 1
    Points
    1
    Par défaut Iteration sur une UICollectionView pour obtenir le contenu d'une cellule : comportement innatendu…
    Bonjour,
    Je veux récupérer un accessibilityIdentifier de chacune de mes cellules de UICollectionView.
    Pour cela, j'effectue les traitements suivants :
    -dans la fonction cellForItemAtIndexPath, Je crée une cellule "custom" (héritant de UICollectionViewCell pour lui ajouter une imageView) avec dequeueReusableCellWithReuseIdentifier

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    - (MyCollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath{
    static NSString *identifier = @"MyCell";        
    MyCollectionViewCell *cell;
    cell = [collectionView dequeueReusableCellWithReuseIdentifier:identifier forIndexPath:indexPath];
    J'ajoute ensuite une ImageView dans ma cellule et je lui donne un identifiant grâce à accessibilityIdentifier

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    imageView.image = [UIImage imageNamed: name];
    [imageView.image setAccessibilityIdentifier:name];
    cell.imageView = currentImageView;
    Quand j'essaie d'accéder à la collectionView existante, je rencontre un problème innatendu :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    NSArray *tableauDesCellules = [self.collectionView visibleCells];
    J'obtiens dans tableauDesCellules un tableau de 0 objets, comme si collectionView était vide. Quand j'essaie d'itérer à travers chacune des cellules visibles par contre, plutôt que de sortir de ma boucle immédiatement, je me retrouve avec des cellules d'index désordonnés. Ainsi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    for(MyCollectionViewCell *cell in self.collectionView.visibleCells)
    {
        NSIndexPath *indexPath = [self.collectionView indexPathForCell:cell];
        NSLog(@"%d",indexPath.item);
    }
    me retourne :

    2014-06-30 14:06:16.702 [5685:60b] 38
    2014-06-30 14:06:16.702 [5685:60b] 17
    2014-06-30 14:06:16.702 [5685:60b] 21
    2014-06-30 14:06:16.703 [5685:60b] 0
    2014-06-30 14:06:16.703 [5685:60b] 25
    2014-06-30 14:06:16.703 [5685:60b] 4
    2014-06-30 14:06:16.704 [5685:60b] 29
    2014-06-30 14:06:16.704 [5685:60b] 8
    2014-06-30 14:06:16.704 [5685:60b] 33


    Du coup, mes accessibilityIdentifiers ne sont pas ceux attendus. Ce problème me bloque depuis des jours et je ne vois pas comment m'en sortir. Toute aide sera grandement appréciée.

    PS : ma fonction cellForItemAtIndexPath effectue une initialisation avec une couleur aléatoire dans chaque cellule. Dois-je y voir un lien ? Si c'est le cas, comment détecter qu'une cellule existe déjà et récupérer son contenu ?

  2. #2
    Membre éclairé
    Avatar de LeBzul
    Homme Profil pro
    Inscrit en
    Décembre 2008
    Messages
    381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations forums :
    Inscription : Décembre 2008
    Messages : 381
    Points : 832
    Points
    832
    Par défaut
    Salut,
    J'imagine que tu passe un Array à UICollectionView lors de l'initialisation;
    Tu as essayé de récupérer tes valeurs directement dans cet Array ? Logiquement la position dans l'array est le même que dans la CollectionView.
    "Quand la lune n'est pas là, la nuit mène une existence obscure"

  3. #3
    Nouveau Candidat au Club
    Homme Profil pro
    Inscrit en
    Janvier 2014
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Janvier 2014
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    Non, j'ai défini une classe dérivant de UICollectionViewController en temps que dataSource et implémenté les méthodes associées numberOfItemsInSection et cellForItemAtIndexPath. Du coup, quand ma UICollectionView se charge, ma méthode cellForItemAtIndexPath est appelée autant de fois que nécessaire pour remplir la colleciton view. Du coup pas d'Array et c'est moins simple.
    Tu pense que c'est une mauvaise pratique ?

  4. #4
    Membre éclairé
    Avatar de LeBzul
    Homme Profil pro
    Inscrit en
    Décembre 2008
    Messages
    381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations forums :
    Inscription : Décembre 2008
    Messages : 381
    Points : 832
    Points
    832
    Par défaut
    Je ne pense pas que ce soit une mauvaise pratique, mais je n'utilise pas celle la.
    Pourquoi as tu besoin de l'accessibilityIdentifier de ton image et à quel moment ?
    Il y a peut être une autre solution pour arriver au but final.

    La methode cellForItemAtIndexPath ne dessine pas une fois toutes les cellules; Elle dessine que celle visible à l'écran, donc si on joue avec le scroll la methode cellForItemAtIndexPath sera appelé autant de fois que les celulles passent de non visible à visible.
    "Quand la lune n'est pas là, la nuit mène une existence obscure"

  5. #5
    Nouveau Candidat au Club
    Homme Profil pro
    Inscrit en
    Janvier 2014
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Janvier 2014
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    J'ai besoin d'un nombre fixe de cellules, j'ai dimensionné cellules et collectionview de façon à ce que chacune des cellules soit présente dans cette dernière sans scroll.
    En conséquent, la fonction cellForItemAtIndexPath est appelée pour chacune de mes cellules dès le chargement de la scène.
    Mon objectif est de récupérer un élément aléatoire parmi ceux présent dans la collection view. Pour cela, je pensais parcourir la collectionView et noter chacun des éléments différents présents dans la liste. L'accessibilityIdentifier est un moyen pour moi de détecter sur quel élément je tombe dans la liste puisque mes éléments sont des imageView.

    Puisque toute mes cellules sont visibles en même temps, je pensais pouvoir itérer à travers cette collection grâce au
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    for(MyCollectionViewCell *cell in self.collectionView.visibleCells)
    {
        NSIndexPath *indexPath = [self.collectionView indexPathForCell:cell];
        NSLog(@"%d",indexPath.item);
    }
    mais l'ordre des cellules que j'obtiens est aberrant, c'est ce que montre le log que j'ai affiché.

  6. #6
    Nouveau Candidat au Club
    Homme Profil pro
    Inscrit en
    Janvier 2014
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Janvier 2014
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    Il existe un bug sur l'attribut visibleCell d'une collectionView : http://openradar.appspot.com/radar?id=2855401
    Les cellules sont renvoyées dans le désordre, mais il n'y a pas de perte pour autant !
    En fait, je n'ai pas de raison de vouloir parcourir la collectionView dans l'ordre, ça me semblait simplement la seule manière logique, et je ne voyais pas comment faire autrement. Pour l'instant, j'ai implémenté une solution où j'incrémente des compteurs dans mon for et vérifie à la fin ce que j'ai obtenu :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    int beige,rouge, bleu, jaune, vert;
    beige=0;
    rouge=0;
    bleu=0;
    vert=0;
    jaune=0;
    int row=0;
    		
    NSArray *tableauDesCellules = [self.collectionView visibleCells];
    
    NSLog(@"iteration through cells");
    	
    for(MyCollectionViewCell *cell in self.collectionView.visibleCells)
    {
            //NSIndexPath *indexPath = [self.collectionView indexPathForCell:cell];
            //NSLog(@"indexPath : %d",indexPath.item);
    
            int level = [preferences integerForKey:@"level"];
    		
    
    		nom_image = [[cell getImageView].image accessibilityIdentifier];
    
    		if([nom_image isEqual:@"beige"])
    			beige++;
    		else if([nom_image isEqual:@"vert"])
    			vert++;
    		else if([nom_image isEqual:@"jaune"])
    			jaune++;
    		else if([nom_image isEqual:@"bleu"])
    			bleu++;
    		else if([nom_image isEqual:@"rouge"])
    			rouge++;
                    row++;
    }
    
    	NSLog(@"Nombre de :");
    	NSLog(@"beige : %d",beige);
    	NSLog(@"jaune : %d",jaune);
    	NSLog(@"bleu : %d",bleu);
    	NSLog(@"rouge : %d",rouge);
    	NSLog(@"vert : %d",vert);
        NSLog(@"%d" ,row);
    Ce n'est pas hyper propre pour autant. Je pense peut-être implémenter une solution avec des tags sur chacune de mes cellules, et itérer parmi les tags. Je reviendrai vers vous dans ce cas.

  7. #7
    Membre éclairé
    Avatar de LeBzul
    Homme Profil pro
    Inscrit en
    Décembre 2008
    Messages
    381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations forums :
    Inscription : Décembre 2008
    Messages : 381
    Points : 832
    Points
    832
    Par défaut
    C'est cool si tu as trouvé une solution à ton problème.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    	if([nom_image isEqual:@"beige"])
    			beige++;
    		else if([nom_image isEqual:@"vert"])
    			vert++;
    		else if([nom_image isEqual:@"jaune"])
    			jaune++;
    		else if([nom_image isEqual:@"bleu"])
    			bleu++;
    		else if([nom_image isEqual:@"rouge"])
    			rouge++;
    Pour améliorer cette partie, tu devrais utiliser un NSMutableDictionary en utilisant comme clef le nom_image et en valeur le nombre d'itération. En gros, si la clef n'existe pas tu l'ajoutes au dictionary avec la valeur 1, sinon tu fais +1 a la valeur déjà présente.
    C'est simple à mettre en place et le jour ou tu voudras ajouter d'autres couleurs, ca fonctionnera sans rajouter de code et ca feras disparaître les quantités de if/else à la chaines.
    "Quand la lune n'est pas là, la nuit mène une existence obscure"

  8. #8
    Expert éminent sénior
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 645
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 645
    Points : 10 602
    Points
    10 602
    Par défaut
    Encore plus simple mettre un tag (propriété de UIView) croissant sur les cellules:
    cellule 1 -> tag X + 0
    cellule 2 -> tag X + 1
    cellule 3 -> tag X + 2
    ...
    cellule n -> tag X + (n - 1)

    Et avec un petit test (0 >= tag - X > n), et un simple tableau short all_counters[n], tu peux faire all_counters[tag - X]++.

    Peut-être un petit enum { n = 50; };

Discussions similaires

  1. Réponses: 3
    Dernier message: 15/02/2014, 18h27
  2. [XL-2003] Créer une macro pour vider le contenu de certaines cellules
    Par lolonico1974 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 30/06/2010, 09h24
  3. Réponses: 24
    Dernier message: 17/04/2008, 14h24
  4. Réponses: 9
    Dernier message: 30/01/2008, 15h40
  5. Réponses: 1
    Dernier message: 05/07/2007, 08h34

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo