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 ?) ...
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 :
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 :
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
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.
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
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.
Réponses
Et comment tu gères la selection des button des cellules ? ( changement d'image,..)
L'image initiale (blanche) est chargé à partir du xib
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 ?) ...
Je vois ça aurai pu être ça : mais selon mon code je n'ai qu'une section :
Et ma tableview dans le storyboard :
Et mon bouton est déclaré en tant que
et est synthetisize dans mon CustomCell.m même si je ne fais rien dans le CustomCell.m
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.
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.
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 :
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:
Et dans ma méthode addFavorite je remplace la création de l'indexPath par :
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:
mais
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
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 !