Ich verwende Wischaktionen in meiner Tabellenansicht. Ich möchte kleine Symbole in der Zeile hinzufügen und löschen, nachdem eine Wischaktion abgeschlossen wurde. Ich verwende dazu einen asynchronen Thread, der jedoch nicht das gewünschte Ergebnis liefert. Mein Code ist unten angegeben. Jede Hilfe wird geschätzt.

func tableView(_ tableView: UITableView, trailingSwipeActionsConfigurationForRowAt indexPath: IndexPath) -> UISwipeActionsConfiguration? {
    let groceryAction = groceryToggleAction(forRowAtIndexPath: indexPath)
    let config = UISwipeActionsConfiguration(actions: [groceryAction])
    return config
}

func tableView(_ tableView: UITableView, leadingSwipeActionsConfigurationForRowAt indexPath: IndexPath) -> UISwipeActionsConfiguration? {
    let consumeAction = consumeToggleAction(forRowAtIndexPath: indexPath)
    let config = UISwipeActionsConfiguration(actions: [consumeAction])
    return config
}

// MARK: Custom Methods
func groceryToggleAction(forRowAtIndexPath indexPath: IndexPath) -> UIContextualAction {
    let food = foods[indexPath.item]
    let action = UIContextualAction(style: .normal, title: "actionTitle") { (action, view, completionHandler) in

        let food = self.foods[indexPath.item]

        food.isAddedToGrocery = !food.isAddedToGrocery
        self.persistenceManager.saveContext()
        DispatchQueue.main.asyncAfter(deadline: .now() + 0.4) {
            self.homeTableView.reloadRows(at: [indexPath], with: .none)
        }
        completionHandler(true)
    }
    action.image = #imageLiteral(resourceName: "shoppingCart") // İyi bir liste ikonu bul...
    action.backgroundColor = food.isAddedToGrocery ? UIColor.Palette.alizarin : UIColor.Palette.turquoise
    action.title = food.isAddedToGrocery ? "Remove" : "Add"
    return action
}

func consumeToggleAction(forRowAtIndexPath indexPath: IndexPath) -> UIContextualAction {
    let food = foods[indexPath.item]

    let action = UIContextualAction(style: .normal, title: "actionTitle") { (action, view, completionHandler) in

        food.isConsumed = !food.isConsumed
        self.persistenceManager.saveContext()
        DispatchQueue.main.asyncAfter(deadline: .now() + 0.4) {
            self.homeTableView.reloadRows(at: [indexPath], with: .none)
        }
        completionHandler(true)

    }
    action.image = #imageLiteral(resourceName: "pacman")
    action.title = food.isConsumed ? "Remove": "Consumed!"
    action.backgroundColor = food.isConsumed ? UIColor.Palette.alizarin : UIColor.Palette.turquoise
    return action
}
1
Ali A. 17 Jän. 2019 im 21:13

3 Antworten

Beste Antwort

Endlich habe ich es herausgefunden. Ich habe einfach die folgende Funktion vom Tableview-Delegaten verwendet.

    func tableView(_ tableView: UITableView, didEndEditingRowAt indexPath: IndexPath?) {
    print("did end editing")
    guard let indexPath = indexPath else {return}
    tableView.reloadRows(at: [indexPath], with: .none)
}
2
Ali A. 18 Jän. 2019 im 08:35
    DispatchQueue.main.async
    {
        self.tableView.reloadData()
    }

Sollte gerade genug sein.

In Ihrem Code erzwingen Sie die Ausführung der App zu einem bestimmten Zeitpunkt. Wenn Ihre Daten dynamisch sind, z. B. Remote-Bilder, können sie die Hauptschleife um mehr als 0,4 Sekunden verzögern und somit zu einer noch ruckeligeren Aktualisierung und Bewegung führen.

0
Johannes Schidlowski 17 Jän. 2019 im 18:25

Sie müssen die UITableView-Löschzeilen integrieren. Dadurch erhalten Sie eine nette Animation anstelle des umständlichen Updates der Reload-Ansicht.

tableView.deleteRows(at: [indexPath], with: UITableViewRowAnimation.automatic)
0
John Lanzivision 17 Jän. 2019 im 19:57