2009-01-28 5 views

Répondre

14

Ici, nous faisons notre levage lourd.

- (void)tableView:(UITableView *)tableView 
moveRowAtIndexPath:(NSIndexPath *)fromIndexPath 
     toIndexPath:(NSIndexPath *)toIndexPath 
{ 
    NSLog(@"move from:%d to:%d", fromIndexPath.row, toIndexPath.row); 
    // fetch the object at the row being moved 
    NSString *r = [rows objectAtIndex:fromIndexPath.row]; 

    // remove the original from the data structure 
    [rows removeObjectAtIndex:fromIndexPath.row]; 

    // insert the object at the target row 
    [rows insertObject:r atIndex:toIndexPath.row]; 
    NSLog(@"result of move :\n%@", [self rows]); 
} 

Puisqu'il s'agit d'un exemple de base, rendons toutes les lignes mobiles.

- (BOOL)tableView:(UITableView *)tableView 
canMoveRowAtIndexPath:(NSIndexPath *)indexPath { 
    return YES; 
} 
+0

Lorsque removeObjectAtIndex est appelé, cela va-t-il réduire le nombre de références de cet objet (et peut-être provoquer son désallocation)? Je pense que exchangeObjectAtIndex: withObjectAtIndex: (comme suggéré par @dreamlax) est plus sûr. –

+0

BTW, si vous répondez à votre propre question, je pense que c'est une bonne forme pour en faire un wiki. –

+0

@KristopherJohnson 'exchangeObjectAtIndex: withObjectAtIndex:' ne convient pas dans ce cas. Il a des sémantiques différentes de celles requises par 'tableView: moveRowAtIndexPath: toIndexPath:'. – Benjohn

0

NSMutableArray a une méthode appelée exchangeObjectAtIndex:withObjectAtIndex:.

+3

J'ai essayé celui-ci, mais le comportement est différent.La table n'échange pas les lignes, elle supprime une ligne, puis l'insère dans un emplacement différent. Si j'utilise cette méthode, la table et le magasin de sauvegarde sont plus désynchronisés à chaque mouvement. –

11

Aucun de ces éléments ne fonctionnera. Dans le code publié original, la tableview se bloque car elle supprime les données qui seront toujours utilisées, et même après que cela a été corrigé, le tableau ne disposerait pas des données correctes en raison de la table de réarrangement.

exchangeObjectAtIndex: withObjectAtIndex: ne fonctionnera pas pour réarranger un tableau selon la façon dont un tableview met en œuvre son propre réarranger

Pourquoi? Parce que lorsque l'utilisateur sélectionne une cellule de tableau pour le réorganiser, cette cellule n'est PAS permutée avec la cellule vers laquelle elle est déplacée. La cellule sélectionnée est insérée dans l'index de la nouvelle ligne, puis la cellule d'origine est supprimée. Au moins, c'est ainsi que cela se présente à l'utilisateur.

Solution: En raison de la façon dont la vue de table implémente une réorganisation, nous devons effectuer une vérification pour nous assurer que nous ajoutons et supprimons la ligne de droite. Ce code que je mets ensemble est simple et fonctionne parfaitement pour moi.

À l'aide des données de code affichées originales comme exemple:


- (void)tableView:(UITableView *)tableView 
moveRowAtIndexPath:(NSIndexPath *)fromIndexPath 
     toIndexPath:(NSIndexPath *)toIndexPath 
{ 
    NSLog(@"move from:%d to:%d", fromIndexPath.row, toIndexPath.row); 
    // fetch the object at the row being moved 
    NSString *r = [rows objectAtIndex:fromIndexPath.row]; 

     // checks to make sure we add and remove the right rows 
    if (fromIndexPath.row > toIndexPath.row) { 

     // insert the object at the target row 
     [rows insertObject:r atIndex:toIndexPath.row]; 

     // remove the original from the data structure 
     [rows removeObjectAtIndex:(fromIndexPath.row + 1)]; 
    } 
    else if (fromIndexPath.row < toIndexPath.row) { 

     // insert the object at the target row 
     [rows insertObject:r atIndex:(toIndexPath.row + 1)]; 

     // remove the original from the data structure 
     [rows removeObjectAtIndex:(fromIndexPath.row)]; 

    } 

} 

Si vous prenez quelques instants et jetez un oeil à ce qui se passe à un tableview au cours d'une Réorganiser vous comprendrez pourquoi nous ajoutons le 1 est là que nous fait. Je suis un peu nouveau sur xcode, donc je sais qu'il y a probablement un moyen plus facile de le faire, ou le code peut probablement être simplifié .... J'essaie juste de vous aider quand je peux car il m'a fallu quelques heures pour comprendre cela. J'espère que cela fait gagner du temps à quelqu'un!

+1

Voici la bonne réponse pour la combinaison de TableView et NSMutableArray – wayneh

+1

Thanx Wiz. Votre code fonctionne parfaitement et a aussi un sens. – Ali

5

Selon la documentation d'Apple, et ma propre expérience, cela est un code simple qui fonctionne très bien:

NSObject *tempObj = [[self.rows objectAtIndex:fromIndexPath.row] retain]; 
[self.rows removeObjectAtIndex:fromIndexPath.row]; 
[self.rows insertObject:tempObj atIndex:toIndexPath.row]; 
[tempObj release]; 
+0

Bonne réponse. Votre est le plus correct de tous. Merci mec! – GeneCode

0

trouvé cette discussion après avoir cassé la tête contre une implémentation simple ... Michael solution Berding est le mieux pour moi, à la manière d'Apple, souvenez-vous simplement d'enlever conserver et relâcher en utilisant ARC. Donc, une solution plus concise

NSObject *tempObj = [self.rows objectAtIndex:fromIndexPath.row]; 
[self.rows removeObjectAtIndex:fromIndexPath.row]; 
[self.rows insertObject:tempObj atIndex:toIndexPath.row]; 
Questions connexes