2010-12-08 22 views
12

Je lis la documentation sur la gestion de la suppression et de la réorganisation des lignes dans UITableView. J'ai créé le bouton d'édition et je suis capable de supprimer des lignes. J'aimerais que l'utilisateur puisse également réorganiser les lignes. Cela semble simple, mais je ne peux pas comprendre comment dire aux cellules qu'elles peuvent être déplacées.Comment afficher les commandes de réorganisation dans UITableView avec les boutons de suppression

Pour indiquer aux lignes qu'elles peuvent être supprimées, j'utilise le fichier editingStyleForRowAtIndexPath, mais comment puis-je dire à la cellule qu'elle peut également être déplacée et où dois-je définir showsReorderControl? J'ai essayé de placer dans cellForRowAtIndexPath, mais rien n'est montré.

Merci!

Répondre

32

Il faut dire que les lignes peuvent être déplacées:

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

et mettre en œuvre ce délégué à mettre à jour votre source de données:

- (void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)sourceIndexPath toIndexPath:(NSIndexPath *)destinationIndexPath 

Voir Managing the Reordering of Rows de Table View Programming Guide for iOS

+0

C'est t La documentation que je suis en train de lire. J'ai déjà implémenté cette méthode exactement de cette façon. Mais je ne peux toujours rien faire. Je peux juste supprimer les lignes. –

+0

Cela fonctionne sur mon application ... postez votre code ... –

+4

Oh désolé, je viens de remarquer qu'il est obligatoire d'implémenter moveRowAtIndexPath. Je pensais qu'il était seulement nécessaire de modifier la source de données. Merci! –

2

Ajouter à @benoit répondre ci-dessus. Si votre modèle se trouve être un tableau mutable, quelque chose comme cela suffirait pour le tableView: moveRowAtIndexPath: toIndexPath:

- (void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)fromIndexPath toIndexPath:(NSIndexPath *)toIndexPath 
{ 
    id objectToMove = [_objects objectAtIndex:fromIndexPath.row]; 
    [_objects removeObjectAtIndex:fromIndexPath.row]; 
    [_objects insertObject:objectToMove atIndex:toIndexPath.row];  
    [tableView reloadData]; 
    [self saveObjects]; // A method of your own to make new positions persistent 
} 
1

essayer. . .ce se chargera de l'organisation et la mise à jour de la cellule en cas de tableview simple,

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

- (void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)sourceIndexPath toIndexPath:(NSIndexPath *)destinationIndexPath 
{ 
    [tableData insertObject: [tableData objectAtIndex:sourceIndexPath.row] atIndex:destinationIndexPath.row]; 
    [tableData removeObjectAtIndex:(sourceIndexPath.row + 1)]; 
} 
4

Dans mon cas, je l'ai mis en œuvre toutes les méthodes de UITableViewDelegate requis comme mentionné dans le document d'Apple et dans les réponses ici, mais ne peut pas voir la nouvelle commande contrôle. Finalement, j'ai découvert que c'est parce que j'ai dépassé la méthode layoutSubviews sans appeler l'implémentation par défaut du super. Après avoir ajouté le [super layoutSubviews], mon contrôle de réorganisation apparaît enfin. La raison pour laquelle nous devons appeler [super layoutSubviews] est que lorsque nous basculons la propriété d'édition de la table, elle appelle la méthode layoutSubviews de la cellule et les commandes fournies par le système telles que le contrôle de réorganisation sont affichées dans la méthode layoutSubviews par défaut de UITableViewCell. Une fois que vous vous en êtes rendu compte, vous pouvez également modifier votre mise en page layoutSubviews pour changer l'apparence de votre cellule selon qu'elle est éditée ou non pour la rendre moins maladroite lorsque le contrôle de réorganisation apparaît.

Voici donc une liste de contrôle pour la remise en ordre de la ligne:

  1. assurez-vous que les méthodes déléguées tableView: canMoveRowAtIndexPath et tableView: moveRowAtIndexPath: toIndexPath sont mises en œuvre
  2. assurez-vous que la propriété d'édition du tableView est réglé sur OUI
  3. Si vous avez une coutume UITableViewCell, assurez-vous que vous appelez [super layoutSubviews] si vous remplacez cette méthode