[Résolu] UIImageView/UIButton dans Custom TableViewCell (saccade)

2»

Réponses

  • Et comment tu gères la selection des button des cellules ? ( changement d'image,..)

  • Am_MeAm_Me Membre
    septembre 2014 modifié #33

    L'image initiale (blanche) est chargé à  partir du xib

  • samirsamir Membre
    septembre 2014 modifié #34

    C'est par ce que tu as plusieurs sections donc le tag = 0 par exemple correspond au tag du button de chaque première cellule de chaque section. ( compris ?) ...


  • Am_MeAm_Me Membre
    septembre 2014 modifié #35

    Je vois ça aurai pu être ça : mais selon mon code je n'ai qu'une section : 



    - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
    {
    return 1;
    }
    - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
    {
    return monArray.count;
    }


    Et ma tableview dans le storyboard : 


     


  • Am_MeAm_Me Membre
    septembre 2014 modifié #36

    Et mon bouton est déclaré en tant que 



    @property (weak, nonatomic) IBOutlet UIButton *addFavorite;

    et est synthetisize dans mon CustomCell.m même si je ne fais rien dans le CustomCell.m


  • samirsamir Membre
    septembre 2014 modifié #37

    Désolé mais je ne vois pas la raison


     


    1. vérifier quand tu as bien mis l'identifiant de la cellule dans le bon endroit dans ton xib. ( identifier = searchCell)


    2. Vérifier qua tu n'as pas oublier quelques part un bout de code qui change l'image de ton button.


  • Am_MeAm_Me Membre
    septembre 2014 modifié #38

    Bon bah merci quand même. Mais bon je viens de vérifier ça : ça ne marche pas.


    j'ai l'impression que je vais devoir abandonner mon application et la dev iOS haha


    Car ne pas savoir créer une application avec des custom cell c'est ... bah ça sert à  rien que je continu xd.


     


    Bon bah merci je tente le tout pour le tout aujourd'hui après ...  :'(


  • Ok finalement en regardons ton code c'est normal que ça ne marchera pas de cette façon.


     


    ça vas marcher pour les cellules qui sont visibles mais dès que la cellule disparait et réallouer ben tu ne sais plus si le button est sélectionnée ou pas.


     


    En gros il faut garder les indexPath des cellules qui sont sélectionner et tester dans le cellForRow...


     


    Voici une discussion qui va t'aider à  implémenter ça :


     


    http://forum.cocoacafe.fr/topic/8626-uitableview-mise-en-evidence-des-cellules-selectionnees/?hl=%2Buitableviewcell+%2Bselection#entry83157


  • Ok je me penche sur le problème merci.


  • Am_MeAm_Me Membre
    septembre 2014 modifié #41

    Alors merci à  tous d'avoir participé à  la conversation. Je pense que mon problème est résolu j'ai suivi le lien de samir :


     


    A savoir que j'ai suivi le conseil d'Aligator dans le post en question : 


     


    1) J'ai crée un NSMutableSet que j'alloue dans mon viewDidLoad : set = [[NSMutableSet alloc]init];


    2) Alors sur le post Alf rempli sont Set avec des NSIndexPath ce qui parait le + logique d'ailleurs car il utilise la méthode didSelectRowAtIndexPath car lui n'a pas de bouton mais utilise l'AccessoryType : mais moi j'ai du procéder autrement car j'utilise la méthode [NSMutableSet containsObject:] et SI dans ma méthode qui s'enclenche lors d'un clic d'un bouton je procède de cette manière :



    - (void)favorite:(id)sender
    {
    UIButton *tmp = (UIButton*)sender;
    NSLog(@sender.tag : %li,(long)tmp.tag);
    NSIndexPath *indexPath = [[NSIndexPath alloc] initWithIndex:tmp.tag];

    if([set containsObject:indexPath])
    {
    [set removeObject:indexPath];
    [tmp setImage:[UIImage imageNamed:@eye_2_white] forState:UIControlStateNormal];
    //[favorites removeObject:<#(id)#>]
    }
    else
    {
    [set addObject:indexPath];
    [tmp setImage:[UIImage imageNamed:@eye_2] forState:UIControlStateNormal];
    [favorites addObject:[monArray objectAtIndex:tmp.tag]];
    }

    NSLog(@Mon NSMutableSet contient : %@",set);
    }

    et bah j'aurai tout faux sur la ligne : vous voyez pourquoi ? : l'objet indexPath que je crée ne contient pas la même adresse mémoire que l'indexPath que me fourni la méthode cellForRowAtIndexPath: !!! 


     


    Donc comment ai-je résolu la chose ?


    Je suis passé par NSNumber qui a 2 méthodes -compare: et -isEqualToNumber:. Et dans la méthode compare: il est noté que 


     


    The compare: method follows the standard C rules for type conversion. For example, if you compare an NSNumber object that has an integer value with anNSNumber object that has a floating point value, the integer value is converted to a floating-point value for comparison.


     


    Donc si je ne dis pas de bêtise(s) quand la méthode [NSMutableSet containsObject:] est appelée sur un NSNumber : cela compare leur valeur !!! et non pas leur adresse mémoire.


     


    Et voilà  ou j'en viens au fait : ça marche très bien. Je voulais avoir un conseil de pro.(n'importe qui donc :P) ai-je raison sur l'histoire des pointeurs ?


    Comme on dit en informatique :" ça marche !!!!" mais parfois ce n'est pas ce que l'on pense malgré que ça marche


     


    PS :


     


    Dans ma méthode cellForRowAtIndexPath:



    if([set containsObject:[NSNumber numberWithInt:indexPath.row]])
    {
    [cell.addFavorite setImage:[UIImage imageNamed:@eye_2] forState:UIControlStateNormal];
    }
    else
    {
    [cell.addFavorite setImage:[UIImage imageNamed:@eye_2_white] forState:UIControlStateNormal];
    }

    Et dans ma méthode addFavorite je remplace la création de l'indexPath par : 



    NSNumber *indexPath = [NSNumber numberWithInt:tmp.tag];//renommez autre chose qu'indexPath bien entendu

  • CéroceCéroce Membre, Modérateur
    septembre 2014 modifié #42

    Il faut utiliser la méthode -[NSObject isEqual:] pour comparer des objets. L'opérateur == fonctionne comme en langage C. Notamment avec deux pointeurs qui sont des références à  des objets, ça compare les pointeurs, pas la valeur des objets.


     


    C'est pour ça qu'on n'écrit pas:



    if(string == @Toto)

    mais



    if([string isEqualToString:@Toto])

  • Am_MeAm_Me Membre
    septembre 2014 modifié #43

    Ouai ça je suis tout à  fait d'accord mais ce que je voulais dire c'est la méthode [NSMutableSet containsObject] fait appel à  une certaine méthode. Oui du coup ça doit être isEqual


     


    Donc oui j'ai dis des bêtises. Mais pour l'indexPath enfin ça compare beaucoup plus de chose : genre l'attribut : row, section etc ... du coup faire comme j'ai fait au départ c'était mauvais.


     


    Mais pour moi qui ai besoin d'un solution simple passer par des NSNumber me parait logique. j'aurai pu passer par NSInteger au passage


  • AliGatorAliGator Membre, Modérateur
    Si tu veux un "set" qui contient juste des entiers je te conseille d'utiliser NSMutableIndexSet plutôt que NSMutableSet.


    C'est fait pour et tu n'auras plus besoin d'encapsuler tes entiers dans un NSNumber et la méthode containsIndex n'a pas de problème de isEqual vu que c'est directement des entiers qui sont comparés.
  • Ok donc il y a encore un type plus poussé pour le set. Bon bah je modifie mon code dès que possible. 


     


    Merci ! :D


Connectez-vous ou Inscrivez-vous pour répondre.