wake-up-neo.com

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

Ich möchte etwas Ähnliches wie die Alarm-App, bei der Sie die Zeile nicht streichen können. Sie können die Zeile jedoch weiterhin im Bearbeitungsmodus löschen.

Wenn tableView: commitEditingStyle: forRowAtIndexPath: auskommentiert ist, habe ich den zu löschenden Wischstrich deaktiviert und die Schaltfläche "Löschen" im Bearbeitungsmodus angezeigt. Was passiert, wenn ich die Schaltfläche "Löschen" drücke? Was wird gerufen?

85
willi

Ok, es stellt sich als ziemlich einfach heraus. Das habe ich getan, um das 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 tableView:commitEditingStyle:forRowAtIndexPath: implementieren, um die Löschung zu bestätigen.

275
willi

Um alles klar zu machen, wird das Löschen zum Löschen nicht aktiviert, es sei denn, tableView:commitEditingStyle:forRowAtIndexPath: ist implementiert.

Während ich in der Entwicklung war, habe ich es nicht implementiert und daher wurde das Löschen zum Löschen nicht aktiviert. In einer fertigen App würde sie natürlich immer implementiert werden, da sonst keine Bearbeitung erfolgen würde.

9
Marc Rochkind

Schnelle Version: 

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

    if(do something){

        return UITableViewCellEditingStyle.Delete or UITableViewCellEditingStyle.Insert

    }
    return UITableViewCellEditingStyle.None

}
4
kareem

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öschbestätigung wird vom 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 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 wirklich löschen. Daher können Sie nach meinem besten Wissen nicht das erreichen, wonach Sie gefragt haben, es sei denn, einige nicht dokumentierte private APIs werden verwendet. Wahrscheinlich ist so die Apple-Anwendung implementiert.

2
Massimo Cafaro

Zu c #:

Ich hatte das gleiche Problem, bei dem es notwendig war, Zeilen mit der Option Delete beim Swipe zu aktivieren/deaktivieren. Mehrere Zeilen mussten nach links geklappt werden und gelöscht werden. Behalten 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 ist, die ohne Duplikate aus der Tabelle gelöscht werden. Dieser Code prüft, ob eine Zeile gelöscht wird, und deaktiviert dann das Durchziehen oder umgekehrt.

Die entsprechende Delegatfunktion ist Swift ist canEditRowAtIndexPath.

0
A.G

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
}

}

0
user4272677

Sie müssen die Funktion CanEditRowAt implementieren.

Sie können .delete in der EditingStyleForRowAt-Funktion 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
}
0
Noodybrank