580 votes

UITableViewCell, affichage du bouton de suppression lors du glissement de la souris

Comment faire pour que le bouton de suppression s'affiche lorsque l'on fait glisser le curseur sur une carte de crédit ? UITableViewCell ? L'événement n'est jamais déclenché et le bouton de suppression n'apparaît jamais.

0 votes

Ver ma réponse à Swift 4 pour une question similaire qui montre jusqu'à 3 manières différentes de créer des actions de glissement pour supprimer pour UITableViewCell s.

0 votes

J'ai posé cette question il y a 8 ans... Veuillez supprimer cette question, elle est largement dépassée. Swift n'existait même pas !

0 votes

Peut-on fixer la hauteur des boutons de balayage latéral ? Par exemple, ma cellule est de 150 et je veux que le bouton ne soit affiché qu'à 50.0f, est-ce possible ?

1049voto

Kurbz Points 5658

Pendant le démarrage en (-viewDidLoad or in storyboard) faire :

self.tableView.allowsMultipleSelectionDuringEditing = false

Remplacement pour prendre en charge l'édition conditionnelle de la vue tableau. Ceci ne doit être implémenté que si vous devez retourner NO pour certains articles. Par défaut, tous les éléments sont modifiables.

- (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath {
    // Return YES if you want the specified item to be editable.
    return YES;
}

// Override to support editing the table view.
- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath {
    if (editingStyle == UITableViewCellEditingStyleDelete) {
        //add code here for when you hit delete
    }    
}

94 votes

Cela fonctionne, mais... - (BOOL)tableView :(UITableView *)tableView canEditRowAtIndexPath :(NSIndexPath *)indexPath ... ne doit être implémenté que si vous devez retourner NO pour certains éléments. Par défaut, tous les éléments sont modifiables, donc vous n'avez pas besoin de l'implémenter si vous retournez toujours YES.

24 votes

Il est également important de savoir qu'il s'agit de méthodes UITableViewDataSource et de PAS Méthodes de l'UITableViewDelegate.

8 votes

72voto

MattDiPasquale Points 23842

Ce code montre comment mettre en œuvre la suppression.

#pragma mark - UITableViewDataSource

// Swipe to delete.
- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath
{
    if (editingStyle == UITableViewCellEditingStyleDelete) {
        [_chats removeObjectAtIndex:indexPath.row];
        [tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationAutomatic];
    }
}

Si vous le souhaitez, dans votre commande d'initialisation, ajoutez la ligne ci-dessous pour afficher le bouton d'édition :

self.navigationItem.leftBarButtonItem = self.editButtonItem;

0 votes

Vous devez implémenter cette méthode. Le contenu doit correspondre à ce qui a un sens pour votre cas d'utilisation. Dans le code ci-dessus, _chats est la donnée de base pour la vue tableau. Une fois que l'utilisateur a cliqué sur "delete", l'objet de chat individuel doit être supprimé de _chat afin que la source de données reflète le nouveau nombre de lignes (sinon, une exception sera levée).

34voto

GenesisST Points 858

Note : Je n'ai pas assez de réputation pour poster un commentaire dans la réponse de Kurbz.

La réponse de Kurbz est juste. Mais pour moi, cela n'a jamais fonctionné.

Après quelques recherches, j'ai réalisé que Le glissement vers la suppression se produit lorsque l'on ne modifie PAS la vue du tableau. .

Je n'ai jamais vu cela explicitement déclaré comme tel. Sauf erreur de ma part, je n'ai pas trouvé d'autre moyen de le faire fonctionner.

Lors de l'édition, la commande de suppression et/ou de réorganisation s'affiche.

26voto

Leon Points 455

J'ai eu un problème que j'ai réussi à résoudre et je le partage car il peut aider quelqu'un.

J'ai un UITableView et j'ai ajouté les méthodes indiquées pour permettre de glisser pour supprimer :

- (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath {
    // Return YES if you want the specified item to be editable.
    return YES;
}

// Override to support editing the table view.
- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath {
    if (editingStyle == UITableViewCellEditingStyleDelete) {
        //add code here for when you hit delete
    }    
}

Je travaille sur une mise à jour qui me permet de mettre le tableau en mode édition et d'activer la sélection multiple. Pour ce faire, j'ai ajouté le code de l'application Apple's TableMultiSelect échantillon. Une fois que j'ai réussi à le faire fonctionner, j'ai découvert que la fonction "glisser-déplacer" ne fonctionnait plus.

Il s'avère que l'ajout de la ligne suivante à viewDidLoad était le problème :

self.tableView.allowsMultipleSelectionDuringEditing = YES;

Avec cette ligne, la sélection multiple fonctionne mais pas le glissement pour supprimer. Sans cette ligne, c'était l'inverse.

La solution :

Ajoutez la méthode suivante à votre viewController :

- (void)setEditing:(BOOL)editing animated:(BOOL)animated
{
    self.tableView.allowsMultipleSelectionDuringEditing = editing; 
    [super setEditing:editing animated:animated];
}

Ensuite, dans votre méthode qui met la table en mode d'édition (à partir d'une pression sur un bouton par exemple), vous devriez utiliser :

[self setEditing:YES animated:YES];

au lieu de :

[self.tableView setEditing:YES animated:YES];

Cela signifie que la sélection multiple n'est activée que lorsque le tableau est en mode édition.

0 votes

C'était utile. J'avais défini allowsMultipleSelection dans le Storyboard. Cela l'a corrigé.

1 votes

Cela a résolu un problème qui nous rendait fous. Je comprends maintenant que "glisser pour supprimer" et "suppression par lots en mode édition" s'excluent mutuellement et que vous devez contrôler cela lorsque vous entrez ou sortez du mode édition. Merci beaucoup d'avoir fait des recherches sur ce sujet !

8voto

Robybyte Points 39

Lorsque vous supprimez une cellule de votre tableau, vous devez également supprimer votre objet tableau à l'indice x.

Je pense que vous pouvez l'enlever en utilisant un geste de balayage. La vue de la table appellera le délégué :

- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath {
    if (editingStyle == UITableViewCellEditingStyleDelete) {
        //add code here for when you hit delete
        [dataSourceArray removeObjectAtIndex:indexPath.row];
    }    
}

Après avoir retiré l'objet. Vous devez recharger l'utilisation de tableview. Ajoutez la ligne suivante dans votre code :

[tableView reloadData];

après cela, vous avez supprimé la ligne avec succès. Et lorsque vous rechargez la vue ou que vous ajoutez des données au DataSource, l'objet ne sera plus là.

Pour tous les autres, la réponse de Kurbz est correcte.

Je voulais seulement vous rappeler que la fonction déléguée ne sera pas suffisante si vous voulez supprimer l'objet du tableau DataSource.

J'espère vous avoir aidé.

4 votes

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X