Pour un exemple simple d'utilisation d'un NSMutableArray de chaînes appelées rows, que dois-je implémenter dans mon contrôleur de table pour déplacer les lignes tableView et faire refléter les changements dans mon tableau?Quelles méthodes dois-je implémenter pour réorganiser les lignes UITableView?
Répondre
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;
}
NSMutableArray
a une méthode appelée exchangeObjectAtIndex:withObjectAtIndex:
.
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. –
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!
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];
Bonne réponse. Votre est le plus correct de tous. Merci mec! – GeneCode
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];
- 1. UITableView problème d'actualisation de cellule sur réorganiser
- 2. UITableView: Vérifier les lignes en mode édition
- 3. Réorganiser les équations pour le solveur
- 4. Utilisation de lignes d'insertion dans un UITableView
- 5. Fonctions d'animation de lignes UITableView groupées
- 6. Comment réorganiser les colonnes
- 7. réorganiser les données
- 8. Quelles sont les différentes méthodes d'hébergement d'un service WCF?
- 9. Quelles règles utilisez-vous pour délimiter les méthodes et les membres MVP
- 10. Quelles méthodes existent pour exploiter SecurID et des technologies similaires?
- 11. Quelles lignes directrices devraient être suivies pour les politiques et les procédures?
- 12. Quelles sont les meilleures ressources pour apprendre à implémenter des classificateurs Naive Bayes dans SSAS?
- 13. SQL pour réorganiser les nœuds dans une hiérarchie
- 14. Quelles sont les méthodes efficaces pour déployer une application Django sur le bureau?
- 15. Quelles sont les méthodes pour vérifier l'entrée de l'utilisateur et empêcher l'injection mysql?
- 16. Comment réorganiser la section dans UITableView en faisant glisser similaire à la ligne?
- 17. Les lignes de séparateur UITableView disparaissent entre les cellules sur le défilement
- 18. Accès aux variables d'instance de méthodes de délégué UITableView
- 19. Réorganiser les utilisateurs dans django auth
- 20. Réorganiser les boutons dans une alerte iPhone?
- 21. Noms de méthodes pour les méthodes d'opérateur en C#
- 22. Quelles sont les différences entre XSLT et les méthodes de génération de code T4?
- 23. Lire les lignes Excel, marquer les lignes lire
- 24. Quelles méthodes deviennent disponibles après la création d'une association?
- 25. Quelles méthodes sont appelées lorsque vous redimensionnez un JFrame?
- 26. Quelles sont les alternatives pour CSharpOptParse?
- 27. Quelles sont les options disponibles pour VisualSVNServerHooks.exe?
- 28. : comment réorganiser le menu?
- 29. Utiliser aspectj pour profiler les méthodes sélectionnées
- 30. Surcharge d'interface générique pour les méthodes?
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. –
BTW, si vous répondez à votre propre question, je pense que c'est une bonne forme pour en faire un wiki. –
@KristopherJohnson 'exchangeObjectAtIndex: withObjectAtIndex:' ne convient pas dans ce cas. Il a des sémantiques différentes de celles requises par 'tableView: moveRowAtIndexPath: toIndexPath:'. – Benjohn