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

91

Je veux quelque chose de similaire à l'application Alarme, où vous ne pouvez pas supprimer la ligne par glissement, mais vous pouvez toujours supprimer la ligne en mode Edition.

Lorsqu'il est commenté tableView: commitEditingStyle: forRowAtIndexPath :, j'ai désactivé le balayage pour supprimer et j'avais toujours le bouton Supprimer en mode Édition, mais que se passe-t-il lorsque j'appuie sur le bouton Supprimer. Qu'est-ce qui est appelé?

Willi
la source

Réponses:

286

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 encore implémenter tableView:commitEditingStyle:forRowAtIndexPath:pour valider la suppression.

Willi
la source
bu puis faites glisser pour supprimer est automatiquement activé, à nouveau. Ou pas?
Massimo Cafaro
Non, glisser pour supprimer n'est pas activé, s'il n'est pas en mode d'édition. C'est pourquoi je retourne UITableViewCellEditingStyleNone par défaut.
willi le
3
Oublié de mentionner que vous avez besoin de if (editStyle == UITableViewCellEditingStyleDelete) dans commitEditingStyle:
willi
Ok, avec cette déclaration, vous avez une action de suppression, mais sa visualisation est différente. Y a-t-il une chance d'avoir cette action avec la même visualisation de la version swipe?
Göktuğ Aral
@giuseppe Cela n'a pas d'importance. Il n'a pas tort en se référant à lui-même. Cette méthode de délégué fait référence à la même tableView, donc il peut utiliser soit ou.
Stephen Paul
9

Juste pour clarifier les choses, glisser pour supprimer ne sera pas activé à moins qu'il ne tableView:commitEditingStyle:forRowAtIndexPath:soit mis en œuvre.

Pendant que j'étais en développement, je ne l'ai pas implémenté, et par conséquent, glisser pour supprimer n'était pas activé. Bien sûr, dans une application terminée, elle serait toujours implémentée, car sinon, il n'y aurait pas d'édition.

Marc Rochkind
la source
4

Version Swift:

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

    if(do something){

        return UITableViewCellEditingStyle.Delete or UITableViewCellEditingStyle.Insert

    }
    return UITableViewCellEditingStyle.None

}
kareem
la source
3

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
}
Noodybrank
la source
2

Fondamentalement, vous activez ou désactivez l'édition à 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 confirmation 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, glisser pour supprimer est automatiquement activé. Si vous n'implémentez pas cette méthode, le balayage pour supprimer n'est pas actif, mais vous ne pouvez pas réellement 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.

Massimo Cafaro
la source
1
J'ai résolu cela en renvoyant UITableViewCellEditingStyleDelete dans tableView: editStyleForRowAtIndexPath: s'il est en mode d'édition.
willi
0

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 vers la gauche et supprimées, conservez-les dans une autre couleur. J'ai réalisé en utilisant cette logique.

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

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

}

Notez que deletedIndexes 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 vice versa.

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

AG
la source
0

Je suis tombé sur ce problème non plus et je l'ai corrigé avec les codes ci-dessous. j'espère 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
}

}

user4272677
la source