Как обновить строку таблицы после действия смахивания - PullRequest
0 голосов
/ 17 января 2019

Я использую действия смахивания в моем табличном представлении. Я хочу добавить и удалить маленькие значки в строке после завершения действия смахивания. Я использую асинхронный поток, чтобы сделать это, но он не дает гладкого результата, как я хотел. Мой код указан ниже, любая помощь будет оценена.

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
}

Ответы [ 3 ]

0 голосов
/ 17 января 2019

Вам нужно интегрировать строки удаления UITableView, это даст хорошую анимацию вместо неуклюжего обновления представления перезагрузки.

tableView.deleteRows(at: [indexPath], with: UITableViewRowAnimation.automatic)
0 голосов
/ 18 января 2019

Наконец я понял это.Я просто использовал приведенную ниже функцию из табличного делегата.

    func tableView(_ tableView: UITableView, didEndEditingRowAt indexPath: IndexPath?) {
    print("did end editing")
    guard let indexPath = indexPath else {return}
    tableView.reloadRows(at: [indexPath], with: .none)
}
0 голосов
/ 17 января 2019
    DispatchQueue.main.async
    {
        self.tableView.reloadData()
    }

должно быть достаточно.

В своем коде вы заставляете приложение выполняться в определенное время. Если ваши данные являются динамическими, например удаленные изображения, они могут задержать основной цикл более чем на 0,4 секунды и, таким образом, вызвать еще более резкое обновление и перемещение.

...