Organiser les cellules d'un TableView
Bonjour
J'ai un petit problème dans la réorganisation des cellules de mon TableView. J'utilise la méthode "- (BOOL)tableView:(UITableView *)tableView canMoveRowAtIndexPath:(NSIndexPath *)indexPath" comme indiqué dans la doc Apple. Puis j'utilise ce bout de code pour bouger mes cellules de place :
Mais dès que je bouge certaines cellules, mon application plante et la console me dit : "Terminating app due to uncaught exception 'NSRangeException', reason: '*** -[__NSArrayM insertObject:atIndex:]: index 2 beyond bounds for empty array"
Et là je n'arrive pas à aller plus loin.
Quelqu'un aurait-il une idée sur la question ?
Merci /smile.png' class='bbc_emoticon' alt=':)' />
J'ai un petit problème dans la réorganisation des cellules de mon TableView. J'utilise la méthode "- (BOOL)tableView:(UITableView *)tableView canMoveRowAtIndexPath:(NSIndexPath *)indexPath" comme indiqué dans la doc Apple. Puis j'utilise ce bout de code pour bouger mes cellules de place :
<br />
- (BOOL)tableView:(UITableView *)tableView canMoveRowAtIndexPath:(NSIndexPath *)indexPath {<br />
return YES;<br />
}<br />
- (void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)fromIndexPath<br />
toIndexPath:(NSIndexPath *)toIndexPath {<br />
NSString *item = [pile objectAtIndex:fromIndexPath.row];<br />
[pile removeObject:item];<br />
[pile insertObject:item atIndex:toIndexPath.row];<br />
}<br />
Mais dès que je bouge certaines cellules, mon application plante et la console me dit : "Terminating app due to uncaught exception 'NSRangeException', reason: '*** -[__NSArrayM insertObject:atIndex:]: index 2 beyond bounds for empty array"
Et là je n'arrive pas à aller plus loin.
Quelqu'un aurait-il une idée sur la question ?
Merci /smile.png' class='bbc_emoticon' alt=':)' />
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
Bon je ne suis pas sûr que ce soit ça car l'exception parle d'un NSRangeException certes, mais pour l'index 2 sur un empty array, et pas sur un array contenant qu'un élément comme ça serait le cas si c'était à cause de ça... mais n'empêche que ça ne fais pas de mal de corriger ça déjà
Pense aussi que quand tu supprimes ton object "item" de ta pile avec removeObject, plus personne ne le retain, donc potentiellement il peut être désalloué et disparaà®tre de la mémoire avant même que tu aies le temps de le réinsérer dans ta pile au nouvel emplacement.
Bien sûr, si tu utilises ARC tu n'auras pas de problème, car ARC est suffisamment intelligent pour insérer les retain/release nécessaires aux bons endroits pour éviter les risques de ce côté. Mais si tu n'utilises pas ARC, il faut penser à faire un retain avant de faire le removeObject pour garder l'item de côté, le temps de faire le insertObject:atIndex, puis ensuite tu pourras relâcher item avec un release. Ou alors faire le insert avant le remove, mais dans ce cas encore une fois attention aux risques de décalage des indexs.
Et sinon au final pour résoudre ton bug, bah... mets des breakpoints et regarde ce que contient ta pile avant le insertObject qui pourrait expliquer le crash.
J'ai eu exactement le même problème il n'y a pas très longtemps, et en relisant bien la doc, il y a un retain dans l'exemple fourni (malheureusement je ne retrouve pas le lien). Sans le retain/release, j'avais un fonctionnement aléatoire...
Par contre, je ne sais pas si tu utilises ARC... Dans ce cas, c'est peut-être différent...
Par contre, si tu insères l'item avant de faire le remove, tu risques d'avoir des surprises au niveau des index de ton tableau (si tu déplaces une ligne de la fin de la table vers le début).
Avec ce bout de code, pas de problème :
Edit : çà y est j'ai retrouvé la doc en question :
http://developer.apple.com/library/ios/#documentation/UserExperience/Conceptual/TableView_iPhone/ManageReorderRow/ManageReorderRow.html#//apple_ref/doc/uid/TP40007451-CH11-SW1