UITableView Swipe zum Löschen deaktivieren, aber im Bearbeitungsmodus noch löschen lassen?


91

Ich möchte etwas Ähnliches wie die Alarm-App, bei der Sie nicht wischen können, um die Zeile zu löschen, aber Sie können die Zeile trotzdem im Bearbeitungsmodus löschen.

Beim Auskommentieren von tableView: commitEditingStyle: forRowAtIndexPath: habe ich das Wischen zum Löschen deaktiviert und die Schaltfläche Löschen im Bearbeitungsmodus beibehalten. Was passiert jedoch, wenn ich die Schaltfläche Löschen drücke? Wie heißt das?

Antworten:


286

Ok, es stellt sich als ziemlich einfach heraus. Folgendes habe ich getan, um dies zu lösen:

Ziel 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
}

Sie müssen noch implementieren tableView:commitEditingStyle:forRowAtIndexPath:, um die Löschung festzuschreiben.


Aber dann wird das Wischen zum Löschen automatisch wieder aktiviert. Oder nicht?
Massimo Cafaro

Nein, das Wischen zum Löschen wird nicht aktiviert, wenn es sich nicht im Bearbeitungsmodus befindet. Aus diesem Grund gebe ich standardmäßig UITableViewCellEditingStyleNone zurück.
Willi

3
Ich habe vergessen zu erwähnen, dass Sie if (editingStyle == UITableViewCellEditingStyleDelete) in commitEditingStyle benötigen:
willi

Ok, mit dieser Anweisung haben Sie eine Löschaktion erhalten, die jedoch eine andere Visualität aufweist. Gibt es eine Chance, diese Aktion mit der gleichen Visualisierung wie die Swipe-Version auszuführen?
Göktuğ Aral

@ Giuseppe Es ist egal. Er liegt nicht falsch, wenn er sich auf das Selbst bezieht. Diese Delegate-Methode verweist auf dieselbe tableView, sodass er entweder oder verwenden kann.
Stephen Paul

9

Um die Dinge klarer zu machen, wird das Wischen zum Löschen nur aktiviert, wenn tableView:commitEditingStyle:forRowAtIndexPath:es implementiert ist.

Während ich in der Entwicklung war, habe ich es nicht implementiert und daher war das Wischen zum Löschen nicht aktiviert. Natürlich würde es in einer fertigen App immer implementiert sein, da sonst keine Bearbeitung stattfinden würde.


4

Schnelle Version:

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

    if(do something){

        return UITableViewCellEditingStyle.Delete or UITableViewCellEditingStyle.Insert

    }
    return UITableViewCellEditingStyle.None

}

3

Sie müssen die CanEditRowAt-Funktion implementieren.

Sie können .delete in der Funktion EditingStyleForRowAt zurückgeben, damit Sie im Bearbeitungsmodus weiterhin löschen können.

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
}

2

Grundsätzlich aktivieren oder deaktivieren Sie die Bearbeitung mit den Methoden

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

Wenn die Bearbeitung aktiviert ist, wird das rote Löschsymbol angezeigt und eine Löschkonformation an den Benutzer angefordert. Wenn der Benutzer bestätigt, die Delegatmethode

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

wird über die Löschanforderung informiert. Wenn Sie diese Methode implementieren, wird das Wischen zum Löschen automatisch aktiviert. Wenn Sie diese Methode nicht implementieren, ist das Wischen zum Löschen nicht aktiv. Sie können die Zeile jedoch nicht tatsächlich löschen. Daher können Sie meines Wissens nicht das erreichen, wonach Sie gefragt haben, es sei denn, Sie verwenden einige undokumentierte private APIs. Wahrscheinlich ist die Apple-Anwendung so implementiert.


1
Ich habe dieses Problem gelöst, indem ich UITableViewCellEditingStyleDelete in tableView zurückgegeben habe: editingStyleForRowAtIndexPath: wenn es sich im Bearbeitungsmodus befindet.
Willi

0

Auf C #:

Ich hatte das gleiche Problem, bei dem es erforderlich war, Zeilen mit der Option Löschen beim Wischen zu aktivieren / deaktivieren. Mehrere Zeilen mussten nach links gewischt und gelöscht werden. Halten Sie sie in einer anderen Farbe. Ich habe es mit dieser Logik erreicht.

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

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

}

Beachten Sie, dass deletedIndexes eine Liste von Indizes sind, die ohne Duplikate aus der Tabelle gelöscht werden. Dieser Code prüft, ob eine Zeile gelöscht wurde, deaktiviert dann das Wischen oder umgekehrt.

Die äquivalente Delegatenfunktion ist Swift canEditRowAtIndexPath.


0

Ich bin auch auf dieses Problem gestoßen und habe es mit den folgenden Codes behoben. hoffe es wird dir helfen.

- (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
}

}}

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.