web-dev-qa-db-fra.com

UITableView désactiver le balayage pour supprimer, mais toujours supprimer en mode édition?

Je veux quelque chose de similaire à l'application Alarm, dans laquelle vous ne pouvez pas supprimer la ligne par effacement, mais vous pouvez toujours supprimer la ligne en mode Edition.

Lorsque mis en commentaire, tableView: commitEditingStyle: forRowAtIndexPath :, j'ai désactivé le balayage à supprimer et j'avais toujours le bouton Supprimer en mode Édition, mais que se passe-t-il lorsque j'appuie sur le bouton Supprimer? Comment s'appelle?

85
willi

Ok, cela s'avère assez facile. Voici ce que j'ai fait pour résoudre ceci:

Objectif c

- (UITableViewCellEditingStyle)tableView:(UITableView *)aTableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath
{
    // Detemine if it's in editing mode
    if (self.tableView.editing)
    {
        return UITableViewCellEditingStyleDelete;
    }

    return UITableViewCellEditingStyleNone;
}

Swift 2

override func tableView(tableView: UITableView, editingStyleForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCellEditingStyle {
    if tableView.editing {
         return .Delete
    }

    return .None
}

Swift 3

override func tableView(_ tableView: UITableView, editingStyleForRowAt indexPath: IndexPath) -> UITableViewCellEditingStyle {
    if tableView.isEditing {
        return .delete
    }

    return .none
}

Vous devez toujours implémenter tableView:commitEditingStyle:forRowAtIndexPath: pour valider la suppression.

275
willi

Simplement pour que les choses soient claires, le balayage-supprimer ne sera activé que si tableView:commitEditingStyle:forRowAtIndexPath: est implémenté.

Alors que j'étais en développement, je ne l'ai pas implémenté et, par conséquent, le balayage pour supprimer n'était pas activé. Bien sûr, dans une application finie, elle serait toujours mise en œuvre, car sinon, il n'y aurait pas de modification.

9
Marc Rochkind

Version rapide: 

override func tableView(tableView: UITableView, editingStyleForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCellEditingStyle {

    if(do something){

        return UITableViewCellEditingStyle.Delete or UITableViewCellEditingStyle.Insert

    }
    return UITableViewCellEditingStyle.None

}
4
kareem

Fondamentalement, vous activez ou désactivez la modification à l'aide des méthodes

- (void)setEditing:(BOOL)editing animated:(BOOL)animated

Si l'édition est activée, l'icône de suppression rouge apparaît et une conformation de suppression est demandée à l'utilisateur. Si l'utilisateur confirme, la méthode déléguée

- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath

est informé de la demande de suppression. Si vous implémentez cette méthode, alors balayer pour supprimer est automatiquement activé. Si vous n'implémentez pas cette méthode, le balayage de suppression n'est pas actif, mais vous ne pouvez pas supprimer la ligne. Par conséquent, à ma connaissance, vous ne pouvez pas réaliser ce que vous avez demandé, à moins d'utiliser des API privées non documentées. C'est probablement ainsi que l'application Apple est implémentée.

2
Massimo Cafaro

Sur C #:

J'ai eu le même problème où il était nécessaire d'activer/désactiver les lignes avec l'option Supprimer lors du balayage. Plusieurs lignes devaient être balayées à gauche et effacées, conservez-les dans une autre couleur. J'ai réussi à utiliser cette logique.

[Export("tableView:canEditRowAtIndexPath:")]
public bool CanEditRow(UITableView tableView, NSIndexPath indexPath)
{

    if (deletedIndexes.Contains(indexPath.Row)){
        return false;
    }
    else{
        return true;
    }

}

Notez que deleteIndexes est une liste d'index qui sont supprimés de la table sans doublons. Ce code vérifie si une ligne est supprimée, puis désactive le balayage ou inversement.

La fonction déléguée équivalente est Swift est canEditRowAtIndexPath.

0
A.G

Je suis tombé sur ce problème non plus et corrigé avec les codes ci-dessous. espérons que cela vous aidera.

- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath {
if (editingStyle == UITableViewCellEditingStyleDelete) {

    BOOL deleteBySwipe = NO;
    for (UIGestureRecognizer* g in tableView.gestureRecognizers) {
        if (g.state == UIGestureRecognizerStateEnded) {
            deleteBySwipe = YES;
            break;
        }
    }

    if (deleteBySwipe) {
        //this gesture may cause delete unintendedly
        return;
    }
    //do delete
}

}

0
user4272677

Vous devez implémenter la fonction CanEditRowAt.

Vous pouvez renvoyer .delete dans la fonction EditingStyleForRowAt afin de pouvoir toujours supprimer en mode édition.

func tableView(_ tableView: UITableView, canEditRowAt indexPath: IndexPath) -> Bool {
    if tableView.isEditing {
        return true
    }
    return false
}

func tableView(_ tableView: UITableView, editingStyleForRowAt indexPath: IndexPath) -> UITableViewCell.EditingStyle {
    return .delete
}
0
Noodybrank