UITableViewCell, Schaltfläche zum Löschen beim Wischen anzeigen

568

Wie wird die Schaltfläche zum Löschen angezeigt, wenn ich auf einem wische UITableViewCell? Das Ereignis wird nie ausgelöst und die Schaltfläche zum Löschen wird nie angezeigt.

Der Lernende
quelle
1
Wenn Sie
Munib
In meiner Swift 4-Antwort finden Sie eine ähnliche Frage , die bis zu drei verschiedene Möglichkeiten zum Erstellen eines Swipe zum Löschen von Aktionen für UITableViewCells zeigt.
Imanou Petit
Ich habe diese Frage vor 8 Jahren gestellt ... bitte löschen Sie diese Frage, sie ist massiv veraltet. Swift gab es nicht einmal!
TheLearner
Können wir die Höhe für die seitlichen Wischknöpfe festlegen? Beispiel: Mein Handy ist 150 und ich möchte, dass die Schaltfläche nur 50.0f anzeigt. Ist das möglich?
Suhas Arvind Patil
Dies funktioniert gut in Zeilen, aber gibt es Hinweise, wie man Abschnitte integriert?
Frostmourne

Antworten:

1035

Während des Startvorgangs in (-viewDidLoad or in storyboard)do:

self.tableView.allowsMultipleSelectionDuringEditing = NO;

Überschreiben, um die bedingte Bearbeitung der Tabellenansicht zu unterstützen. Dies muss nur implementiert werden, wenn Sie NOfür einige Artikel zurückkehren möchten. Standardmäßig können alle Elemente bearbeitet werden.

- (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
    }    
}
Kurbz
quelle
94
Dies funktioniert, aber ... - (BOOL) tableView: (UITableView *) tableView canEditRowAtIndexPath: (NSIndexPath *) indexPath ... muss nur implementiert werden, wenn Sie für einige Elemente NO zurückgeben möchten. Standardmäßig können alle Elemente bearbeitet werden, sodass Sie sie nicht implementieren müssen, wenn Sie immer JA zurückgeben.
Thanos Diacakis
24
Ebenfalls wichtig zu wissen: Dies sind UITableViewDataSource-Methoden und NICHT UITableViewDelegate-Methoden.
Dave Albert
8
Sie fragen sich, wie Sie das Löschen implementieren sollen ?
ma11hew28
12
Nur um klar zu sein - Sie MÜSSEN tableView: commitEditingStyle: forRowAtIndexPath: überschreiben, da sonst die Wischgeste nicht erkannt wird und beim Löschen nichts passiert.
Chris
Dies hat bei mir (zunächst) nicht funktioniert. Ich musste auch festlegen, self.tableView.allowsMultipleSelectionDuringEditing = NO;dass der linke Wisch funktioniert. Das klingt für mich nach einem Fehler, da sich die Tabelle NICHT im Bearbeitungsstatus befindet. Diese Option sollte nur "Während der Bearbeitung" gelten. Es funktioniert jetzt jedoch und ich setze es auf YES, wenn die Tabelle in den Bearbeitungsstatus wechselt.
Osxdirk
118

Diese Antwort wurde auf Swift 3 aktualisiert

Ich finde es immer schön, ein sehr einfaches, in sich geschlossenes Beispiel zu haben, damit beim Lernen einer neuen Aufgabe nichts angenommen wird. Diese Antwort dient zum Löschen von UITableViewZeilen. Das Projekt läuft folgendermaßen ab:

Geben Sie hier die Bildbeschreibung ein

Dieses Projekt basiert auf dem UITableView-Beispiel für Swift .

Fügen Sie den Code hinzu

Erstellen Sie ein neues Projekt und ersetzen Sie den Code ViewController.swift durch den folgenden.

import UIKit
class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {

    // These strings will be the data for the table view cells
    var animals: [String] = ["Horse", "Cow", "Camel", "Pig", "Sheep", "Goat"]

    let cellReuseIdentifier = "cell"

    @IBOutlet var tableView: UITableView!

    override func viewDidLoad() {
        super.viewDidLoad()

        // It is possible to do the following three things in the Interface Builder
        // rather than in code if you prefer.
        self.tableView.register(UITableViewCell.self, forCellReuseIdentifier: cellReuseIdentifier)
        tableView.delegate = self
        tableView.dataSource = self
    }

    // number of rows in table view
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return self.animals.count
    }

    // create a cell for each table view row
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

        let cell:UITableViewCell = self.tableView.dequeueReusableCell(withIdentifier: cellReuseIdentifier) as UITableViewCell!

        cell.textLabel?.text = self.animals[indexPath.row]

        return cell
    }

    // method to run when table view cell is tapped
    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        print("You tapped cell number \(indexPath.row).")
    }

    // this method handles row deletion
    func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) {

        if editingStyle == .delete {

            // remove the item from the data model
            animals.remove(at: indexPath.row)

            // delete the table view row
            tableView.deleteRows(at: [indexPath], with: .fade)

        } else if editingStyle == .insert {
            // Not used in our example, but if you were adding a new row, this is where you would do it.
        }
    }

}

Die Einzelschlüsselmethode im obigen Code, die das Löschen von Zeilen ermöglicht, ist die letzte. Hier ist es wieder zur Betonung:

// this method handles row deletion
func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) {

    if editingStyle == .delete {

        // remove the item from the data model
        animals.remove(at: indexPath.row)

        // delete the table view row
        tableView.deleteRows(at: [indexPath], with: .fade)

    } else if editingStyle == .insert {
        // Not used in our example, but if you were adding a new row, this is where you would do it.
    }
}

Storyboard

Fügen Sie UITableViewdem Story Controller im Storyboard ein hinzu. Verwenden Sie das automatische Layout, um die vier Seiten der Tabellenansicht an den Rändern des View Controllers zu befestigen. Steuern Sie das Ziehen von der Tabellenansicht im Storyboard auf die @IBOutlet var tableView: UITableView!Zeile im Code.

Fertig

Das ist alles. Sie sollten jetzt in der Lage sein, Ihre App auszuführen und Zeilen zu löschen, indem Sie nach links wischen und auf "Löschen" tippen.


Variationen

Ändern Sie den Text der Schaltfläche "Löschen"

Geben Sie hier die Bildbeschreibung ein

Fügen Sie die folgende Methode hinzu:

func tableView(_ tableView: UITableView, titleForDeleteConfirmationButtonForRowAt indexPath: IndexPath) -> String? {
    return "Erase"
}

Benutzerdefinierte Schaltflächenaktionen

Geben Sie hier die Bildbeschreibung ein

Fügen Sie die folgende Methode hinzu.

func tableView(_ tableView: UITableView, editActionsForRowAt indexPath: IndexPath) -> [UITableViewRowAction]? {

    // action one
    let editAction = UITableViewRowAction(style: .default, title: "Edit", handler: { (action, indexPath) in
        print("Edit tapped")
    })
    editAction.backgroundColor = UIColor.blue

    // action two
    let deleteAction = UITableViewRowAction(style: .default, title: "Delete", handler: { (action, indexPath) in
        print("Delete tapped")
    })
    deleteAction.backgroundColor = UIColor.red

    return [editAction, deleteAction]
}

Beachten Sie, dass dies nur unter iOS 8 verfügbar ist. Weitere Informationen finden Sie in dieser Antwort .

Aktualisiert für iOS 11

Aktionen können mithilfe von Methoden, die der UITableViewDelegate-API in iOS 11 hinzugefügt wurden, entweder vor oder nach der Zelle platziert werden.

func tableView(_ tableView: UITableView,
                leadingSwipeActionsConfigurationForRowAt indexPath: IndexPath) -> UISwipeActionsConfiguration?
 {
     let editAction = UIContextualAction(style: .normal, title:  "Edit", handler: { (ac:UIContextualAction, view:UIView, success:(Bool) -> Void) in
             success(true)
         })
editAction.backgroundColor = .blue

         return UISwipeActionsConfiguration(actions: [editAction])
 }

 func tableView(_ tableView: UITableView,
                trailingSwipeActionsConfigurationForRowAt indexPath: IndexPath) -> UISwipeActionsConfiguration?
 {
     let deleteAction = UIContextualAction(style: .normal, title:  "Delete", handler: { (ac:UIContextualAction, view:UIView, success:(Bool) -> Void) in
         success(true)
     })
     deleteAction.backgroundColor = .red

     return UISwipeActionsConfiguration(actions: [deleteAction])
 }

Weiterführende Literatur

Suragch
quelle
danke für die beispiele & code. Ich bin jetzt bereit, die Löschfunktion zu implementieren. Können Sie mir bitte sagen, was der Zweck der Zeile "self.tableView.registerClass (..." ist, die Sie zu viewDidLoad () hinzugefügt haben? Und was entspricht dem im Interface Builder? Das war nicht im Beispiel für benutzerdefinierte Zellen. Scheint, als würden wir cellReuseIdentifier jetzt zweimal angeben. Danke!
Rockhammer
Wenn die .registerClass-Zeile eingeschlossen ist, schlägt die Kompilierung fehl
Rockhammer
@rockhammer, Sie haben Recht, Sie müssen die Kennung für die Wiederverwendung von Zellen nicht sowohl im Code als auch im Interface Builder festlegen (anscheinend nicht). Wählen Sie einfach einen Weg nach Ihren Wünschen. Obwohl dieses Projekt auf Basis dieses Grund UITableViewein , das ist ein ganz allein Projekt steht und Sie nicht zu tun , etwas braucht , die hier nicht beschrieben ist. Der Grund, warum ich damit begonnen habe, es in Code zu setzen, ist, dass meine Antworten weniger Erklärungen erfordern. Ich sollte zurückgehen und das grundlegende Beispiel bearbeiten, um auch Code zu verwenden.
Suragch
Wie würde man einen richtigen Schlag implementieren? Angenommen, ein linker Schlag "lehnt" etwas ab und ein rechter Schlag "akzeptiert" etwas in der Zelle?
Munib
1
@ return0 Soweit ich weiß, ist die Right-Swipe-Funktionalität nicht integriert, daher müssten Sie sie von Grund auf neu erstellen. In diesem Artikel finden Sie Ideen für den Einstieg, wenn Sie es versuchen möchten. Ich würde dies jedoch nicht empfehlen, da dies keine Standardaktion ist, die ein Benutzer erwarten würde. Vielmehr würde ich zwei Schaltflächen auf einem linken Wisch anzeigen, wie im Abschnitt mit den benutzerdefinierten Schaltflächenaktionen in meiner Antwort oben.
Suragch
70

Dieser Code zeigt, wie das Löschen implementiert wird.

#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];
    }
}

Fügen Sie in Ihrer Initialisierungsüberschreibung optional die folgende Zeile hinzu, um das Schaltflächenelement Bearbeiten anzuzeigen:

self.navigationItem.leftBarButtonItem = self.editButtonItem;
ma11hew28
quelle
Sie müssen diese Methode implementieren. Der Inhalt sollte mit dem übereinstimmen, was für Ihren Anwendungsfall sinnvoll ist. Im obigen Code enthält _chats die Sicherungsdaten für die Tabellenansicht. Sobald der Benutzer auf Löschen klickt, sollte das einzelne Chat-Objekt aus _chat entfernt werden, damit die Datenquelle die neue Zeilenanzahl widerspiegelt (andernfalls wird eine Ausnahme ausgelöst).
Ewcy
25

Ich hatte ein Problem, das ich gerade gelöst habe, also teile ich es, da es jemandem helfen kann.

Ich habe eine UITableView und habe die angezeigten Methoden hinzugefügt, damit Swipe gelöscht werden kann:

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

Ich arbeite an einem Update, mit dem ich die Tabelle in den Bearbeitungsmodus versetzen und die Mehrfachauswahl aktivieren kann. Dazu habe ich den Code aus dem TableMultiSelect- Beispiel von Apple hinzugefügt . Sobald ich das zum Laufen gebracht hatte, stellte ich fest, dass mein Löschen die Löschfunktion nicht mehr funktionierte.

Es stellt sich heraus, dass das Hinzufügen der folgenden Zeile zu viewDidLoad das Problem war:

self.tableView.allowsMultipleSelectionDuringEditing = YES;

Mit dieser Zeile würde die Mehrfachauswahl funktionieren, das Wischen zum Löschen jedoch nicht. Ohne die Linie war es umgekehrt.

Die Reparatur:

Fügen Sie Ihrem viewController die folgende Methode hinzu:

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

In Ihrer Methode, mit der die Tabelle in den Bearbeitungsmodus versetzt wird (z. B. durch Drücken einer Taste), sollten Sie Folgendes verwenden:

[self setEditing:YES animated:YES];

anstatt:

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

Dies bedeutet, dass die Mehrfachauswahl nur aktiviert ist, wenn sich die Tabelle im Bearbeitungsmodus befindet.

Leon
quelle
Das war hilfreich. Ich hatte im Storyboard allowMultipleSelection festgelegt. Dies hat es behoben.
Mark Suman
1
Dies hat ein Problem gelöst, das uns verrückt gemacht hat. Ich verstehe jetzt, dass "Swipe to Delete" und "Batch Deletion in Editiermodus" sich grundsätzlich gegenseitig ausschließen und Sie dies steuern müssen, wenn Sie in den Editiermodus wechseln oder ihn verlassen. Vielen Dank für die Recherche!
fbitterlich
18

Unten hilft Ihnen UITableViewDataSource beim Löschen durch Wischen

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

- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath {
    if (editingStyle == UITableViewCellEditingStyleDelete) {
        [arrYears removeObjectAtIndex:indexPath.row];
        [tableView reloadData];
    }
}

arrYears ist ein NSMutableArray und lädt dann die tableView neu

Schnell

 func tableView(tableView: UITableView, canEditRowAtIndexPath indexPath: NSIndexPath) -> Bool {
            return true
        }

func tableView(tableView: UITableView, commitEditingStyle editingStyle: UITableViewCellEditingStyle, forRowAtIndexPath indexPath: NSIndexPath) {
    if editingStyle == UITableViewCellEditingStyleDelete {
        arrYears.removeObjectAtIndex(indexPath.row)
        tableView.reloadData()
    }
}
iAnkit
quelle
Aber es ist UITableViewDataSource
HotJard
17

In iOS 8 und Swift 2.0 versuchen Sie dies bitte,

override func tableView(tableView: UITableView, canEditRowAtIndexPath indexPath: NSIndexPath) -> Bool {
   // let the controller to know that able to edit tableView's row 
   return true
}

override func tableView(tableView: UITableView, commitEdittingStyle editingStyle UITableViewCellEditingStyle, forRowAtIndexPath indexPath: NSIndexPath)  {
   // if you want to apply with iOS 8 or earlier version you must add this function too. (just left in blank code)
}

override func tableView(tableView: UITableView, editActionsForRowAtIndexPath indexPath: NSIndexPath) -> [UITableViewRowAction]?  {
   // add the action button you want to show when swiping on tableView's cell , in this case add the delete button.
   let deleteAction = UITableViewRowAction(style: .Default, title: "Delete", handler: { (action , indexPath) -> Void in

   // Your delete code here.....
   .........
   .........
   })

   // You can set its properties like normal button
   deleteAction.backgroundColor = UIColor.redColor()

   return [deleteAction]
}
Masa S-AiYa
quelle
Dies ist eine gute Antwort. Hiermit können Sie auch mehrere Aktionen einrichten.
Munib
11

Die Antwort von @ Kurbz ist großartig, aber ich möchte diese Notiz hinterlassen und hoffe, dass diese Antwort den Menschen Zeit sparen kann.

Ich hatte gelegentlich diese Zeilen in meinem Controller und sie führten dazu, dass die Wischfunktion nicht funktionierte.

- (UITableViewCellEditingStyle)tableView:(UITableView *)tableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath{
    return UITableViewCellEditingStyleNone; 
}

Wenn Sie UITableViewCellEditingStyleInsertoder UITableViewCellEditingStyleNoneals Bearbeitungsstil verwenden, funktioniert die Wischfunktion nicht. Sie können nur UITableViewCellEditingStyleDeleteden Standardstil verwenden.

Brian
quelle
1
In meinem Fall wollte ich wischen können, um zu löschen, aber dann auch meine Zellen verschieben können. Eine bewegliche Zelle erhält auch diese Schaltfläche "Löschen" auf der linken Seite der Zelle, die nicht in mein Design passt. Um dies zu entfernen, sollte der Bearbeitungsstil .none sein. Ich löste dies durch "if tableView.isEditing {return .none} else {return .delete}"
Hat meinen Axz-Typ gerettet. Danke :)
Sourav Chandra
9

Swift 4

func tableView(_ tableView: UITableView, editActionsForRowAt indexPath: IndexPath) -> [UITableViewRowAction]? {
    let delete = UITableViewRowAction(style: .destructive, title: "delete") { (action, indexPath) in
        // delete item at indexPath
    tableView.deleteRows(at: [indexPath], with: .fade)

    }
    return [delete]
}
Pratik Lad
quelle
1
OK, dadurch wird die Registerkarte "Löschen" angezeigt, aber nicht gelöscht, wenn Sie darauf drücken. Sie müssen das Objekt in der Datenquelle löschen und die Tabelle neu laden ja?
user3069232
ja "// Element bei indexPath löschen" Platzierungslogik Ihrer Löschzeile basierend auf indexPath
Pratik Lad
8

Dies kann auch in SWIFT unter Verwendung des folgenden Verfahrens erreicht werden

func tableView(tableView: UITableView, commitEditingStyle editingStyle: UITableViewCellEditingStyle, forRowAtIndexPath indexPath: NSIndexPath) {
    if (editingStyle == UITableViewCellEditingStyle.Delete){
        testArray.removeAtIndex(indexPath.row)
        goalsTableView.deleteRowsAtIndexPaths([indexPath], withRowAnimation: UITableViewRowAnimation.Automatic)
    }
}
DrPatience
quelle
8

Swift 3

Sie müssen lediglich diese beiden Funktionen aktivieren:

func tableView(_ tableView: UITableView, canEditRowAt indexPath: IndexPath) -> Bool {

    return true

}

func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) {

    if editingStyle == UITableViewCellEditingStyle.delete {
        tableView.reloadData()
    }

}
Machado
quelle
7

Ich weiß, ist eine alte Frage, aber die Antwort von @Kurbz benötigt diese nur für Xcode 6.3.2 und SDK 8.3

Ich muss hinzufügen [tableView beginUpdates]und [tableView endUpdates](danke an @ bay.phillips hier )

// Override to support editing the table view.
- (void)tableView:(UITableView *)tableView commitEditingStyle: (UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath {
    // Open "Transaction"
    [tableView beginUpdates];

    if (editingStyle == UITableViewCellEditingStyleDelete) {
        // your code goes here
        //add code here for when you hit delete
        [tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationFade];
     }

    // Close "Transaction"
    [tableView endUpdates];
}
Sein zu
quelle
6

Wenn Sie eine Zelle Ihrer Tabellenansicht entfernen, müssen Sie auch Ihr Array-Objekt am Index x entfernen.

Ich denke, Sie können es mit einer Wischgeste entfernen. In der Tabellenansicht wird der Delegat aufgerufen:

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

Nach dem Entfernen des Objekts. Sie müssen die Tabellenansicht neu laden. Fügen Sie Ihrem Code die folgende Zeile hinzu:

[tableView reloadData];

Danach haben Sie die Zeile erfolgreich gelöscht. Und wenn Sie die Ansicht neu laden oder Daten zur DataSource hinzufügen, ist das Objekt nicht mehr vorhanden.

Für alle anderen ist die Antwort von Kurbz richtig.

Ich wollte Sie nur daran erinnern, dass die Delegatenfunktion nicht ausreicht, wenn Sie das Objekt aus dem DataSource-Array entfernen möchten.

Ich hoffe ich habe dir geholfen.

Robybyte
quelle
6
- (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];
        [tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationAutomatic];
    }    
}    
Rahul K Rajan
quelle
dataSourceArray ist das Array, aus dem der Zellinhalt stammt
Rahul K Rajan
2

Swift 2.2:

override func tableView(tableView: UITableView, canEditRowAtIndexPath indexPath: NSIndexPath) -> Bool {
    return true
}

override func tableView(tableView: UITableView,
    editActionsForRowAtIndexPath indexPath: NSIndexPath) -> [UITableViewRowAction]? {
    let delete = UITableViewRowAction(style: UITableViewRowActionStyle.Default, title: "DELETE"){(UITableViewRowAction,NSIndexPath) -> Void in

    print("Your action when user pressed delete")
}
let edit = UITableViewRowAction(style: UITableViewRowActionStyle.Normal, title: "EDIT"){(UITableViewRowAction,NSIndexPath) -> Void in

    print("Your action when user pressed edit")
}
    return [delete, block]
}
lcl
quelle
2

Für Swift schreiben Sie einfach diesen Code

func tableView(tableView: UITableView, commitEditingStyle editingStyle: UITableViewCellEditingStyle, forRowAtIndexPath indexPath: NSIndexPath) {
        if editingStyle == .Delete {
            print("Delete Hit")
        }
}

Schreiben Sie für Ziel C einfach diesen Code

- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath {
       if (editingStyle == UITableViewCellEditingStyleDelete) {           
            NSLog(@"index: %@",indexPath.row);
           }
}
Kiran Jasvanee
quelle
2

Aktivieren Sie für swift4-Code zunächst die Bearbeitung:

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

Anschließend fügen Sie dem Bearbeitungsdelegierten eine Löschaktion hinzu:

func tableView(_ tableView: UITableView, editActionsForRowAt indexPath: IndexPath) -> [UITableViewRowAction]? {
    let action = UITableViewRowAction(style: .destructive, title: "Delete") { (_, index) in
        // delete model object at the index
        self.models[index.row]
        // then delete the cell
        tableView.beginUpdates()
        tableView.deleteRows(at: [index], with: .automatic)
        tableView.endUpdates()

    }
    return [action]
}
Abdoelrhman
quelle
0

Swift 4,5

Um eine Zelle beim Wischen zu löschen, gibt es zwei integrierte Methoden von UITableView. Schreiben Sie diese Methode in die TableView dataSource-Erweiterung.

func tableView(_ tableView: UITableView, trailingSwipeActionsConfigurationForRowAt indexPath: IndexPath) -> UISwipeActionsConfiguration? {
        let delete = deleteProperty(at: indexPath)
        return UISwipeActionsConfiguration(actions: [delete])
    }

//Declare this method in Viewcontroller Main and modify according to your need

func deleteProperty(at indexpath: IndexPath) -> UIContextualAction {
        let action = UIContextualAction(style: .destructive, title: "Delete") { (action, view, completon) in
            self.yourArray.remove(at: indexpath) //Removing from array at selected index

            completon(true)
        action.backgroundColor = .red //cell background color
    }
        return action
    }
MALIKK HABIB UR REHMAN
quelle
0

Wenn Sie unterschiedliche Datenquellen verwenden, müssen Sie die Rückrufe der Delegierten in eine UITableViewDiffableDataSourceUnterklasse verschieben. Zum Beispiel:

class DataSource: UITableViewDiffableDataSource<SectionType, ItemType> {

    override func tableView(_ tableView: UITableView, canEditRowAt indexPath: IndexPath) -> Bool {
        return true
    }

    override func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCell.EditingStyle, forRowAt indexPath: IndexPath) {
        if editingStyle == .delete {
            if let identifierToDelete = itemIdentifier(for: indexPath) {
                var snapshot = self.snapshot()
                snapshot.deleteItems([identifierToDelete])
                apply(snapshot)
            }
        }
    }
}
Austin Conlon
quelle