tableView.selectRow не имеет эффекта при вызове в обратном вызове UIContextualAction - PullRequest
0 голосов
/ 29 мая 2019

При вызове selectRow(at:animated:scrollPosition:) внутри обратного вызова UIContextualAction ничего не меняется: указанная строка не становится серой.

Вот самый простой код, который я мог написать, который демонстрирует проблему:

override func tableView(_ tableView: UITableView, trailingSwipeActionsConfigurationForRowAt indexPath: IndexPath) -> UISwipeActionsConfiguration? {
    let deleteAction = UIContextualAction(style: .destructive, title: "Delete") { _, _, callback in
        tableView.selectRow(at: IndexPath(item: 0, section: 0), animated: true, scrollPosition: .none)
        callback(true)
    }

    return UISwipeActionsConfiguration(actions: [deleteAction])
}

Я перепробовал множество вариантов:

  • , правильно выполняющих операцию удаления (обновление модели с последующим обновлением табличного представления с помощью deleteRows())
  • без анимации операции выбора
  • с использованием действия .normal вместо .destructive one
  • , группирующего различные части кода обратного вызова в tableView.performBatchUpdates() блоке
  • , вызывающего все эти методы в различных порядкахвнутри и снаружи performBatchUpdates() вызов
  • каким-то образом ожидает окончания анимации удаления, когда CATransaction.setCompletionBlock()
  • отправляет операцию выбора в основную очередь, чтобы она позже выполнила smidge

Все безуспешно.

Ответы [ 2 ]

0 голосов
/ 29 мая 2019

В конкретном случае действия удаления вы можете реализовать метод делегата tableView(tableView: cell: indexPath:) и выполнить там выбор;убедитесь, что ячейка не просто прокручивается за пределами экрана.

func tableView(_ tableView: UITableView, didEndDisplaying cell: UITableViewCell, forRowAt indexPath: IndexPath) {
    if cellWasBeingDeleted(cell) { // your own implementation
        tableView.selectRow(at: IndexPath(item: 0, section: 0), animated: true, scrollPosition: .none)
    }
}
0 голосов
/ 29 мая 2019

Один временный способ добиться успеха в операции выбора - использовать таймер для вызова selectRow() после завершения анимации удаления:

override func tableView(_ tableView: UITableView, trailingSwipeActionsConfigurationForRowAt indexPath: IndexPath) -> UISwipeActionsConfiguration? {
    let deleteAction = UIContextualAction(style: .destructive, title: "Delete") { _, _, callback in
        Timer.scheduledTimer(withTimeInterval: 0.5, repeats: false) { _ in
            tableView.selectRow(at: IndexPath(item: 0, section: 0), animated: true, scrollPosition: .none)
        }
        callback(true)
    }

    return UISwipeActionsConfiguration(actions: [deleteAction])
}

Это, очевидно, далеко от чистого решения,поскольку это зависит от того, сколько времени анимация не изменится в будущих выпусках iOS, и требует написания дополнительного кода, чтобы убедиться, что операция выбора все еще актуальна спустя 0,5 секунды, когда срабатывает таймер (что я не делал в этом примере).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...