2017-10-12 2 views
1

Ich versuche, den iOS 11-Weg zu verwenden, um Swipe-Aktionen in einer Tabellenansichtszeile hinzuzufügen. Ich möchte eine Aktion hinzufügen, um eine Zeile zu löschen.UITableView - Destruktive UIContextualAction lädt keine Daten

My Prüftabelle Ansicht zeigt Zahlen von 0 bis 9, wobei die Datenquelle mit einer einfachen Matrix von ganzen Zahlen ist, die so genannten numbers:

class ViewController: UIViewController { 
    var numbers = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 
} 

Wenn ich eine Zeile auswählen, I den zugehörigen Wert von numbers drucken:

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { 
    print(numbers[indexPath.row]) 
    tableView.deselectRow(at: indexPath, animated: true) 
} 

ich den neuen Delegierten implementieren trailingSwipeActionsConfigurationForRowAt wie folgt:

func tableView(_ tableView: UITableView, trailingSwipeActionsConfigurationForRowAt indexPath: IndexPath) -> UISwipeActionsConfiguration? { 

    let delete = UIContextualAction(style: .destructive, title: "Delete") { (_, _, completionHandler) in 
     self.numbers.remove(at: indexPath.row) 
     completionHandler(true) 
    } 

    return UISwipeActionsConfiguration(actions: [delete]) 
} 

Wenn ich in einer Zeile wische, funktioniert das Löschen gut. Aber, und das ist mein Problem, wenn ich eine weitere Zeile nach dem Löschen auswählen, die zugehörige IndexPath falsch ist ...

Beispiel:

  • ich die erste Zeile auswählen, gedruckt der Wert 0: OK.
  • Ich lösche die erste Zeile.
  • Ich wähle die neue erste Zeile, der gedruckte Wert ist 2, da der übergebene IndexPath in Parameter Zeile 1 statt Zeile 0 ist: nicht OK.

Was mache ich falsch?

Antwort

3

Es ist wichtig zu erinnern, dass es ein Modell gibt, das numbers Array in Ihrem Fall, und eine Ansicht, die Zellen, die angezeigt werden. Wenn Sie das Element von numbers entfernen, aktualisieren Sie nur das Modell.

In den meisten Fällen, wie Sie es codiert haben, würden Sie kurz darauf einen Fehler erhalten, da das Modell nicht mit der Ansicht synchronisiert ist.

Allerdings zeigt meine Prüfung an, dass, wenn der Stil .destructive ist und Sie true an completionHandler übergeben, Apple die Zeile für Sie entfernt. Deshalb sehen Sie, dass die Reihe verschwindet. Aber da stimmt etwas nicht und ich kann keine Dokumentation darüber finden.

In der Zwischenzeit tun nur dies:

self.numbers.remove(at: indexPath.row) 
tableView.deleteRows(at: [indexPath], with: .automatic) 
completionHandler(true) 

Und immer daran denken, dass, wenn Sie mit dem Modell ändern müssen Sie die Ansicht aktualisieren.

+0

Danke dafür! Ich bin ziemlich verwirrt wegen des Mangels an Dokumentation rund um den Completion-Handler. Als eines der Argumente in dem Closure-Block, der an den Initiator "UIContextualAction" übergeben wurde, ist es wahrscheinlich, dass wir nichts definieren können. – aganders3