Невозможно провести пальцем по экрану, чтобы удалить с помощью tableview, используя источник данных в iOS 13
Я обновляю UITableViewController
использовать новый UITableViewDiffableDataSource
, У меня все работает, кроме свайпа для удаления.
Это пример того, как я использую смахивание для удаления
func tableView(_ tableView: UITableView, trailingSwipeActionsConfigurationForRowAt indexPath: IndexPath) -> UISwipeActionsConfiguration? {
let lockedAction = UIContextualAction(style: .normal, title: "TEST") { (_, _, completion) in
print("tapped....")
completion(true)
}
return UISwipeActionsConfiguration(actions: [lockedAction])
}
Но это не работает в UITableViewController
который имеет UITableViewDiffableDataSource
Нет свайпа, точка останова внутри метода тоже никогда не вызывается
Я думал, что это бета-ошибка, но я обновился до Xcode 11 GM, и происходит то же самое.
Спасибо за любой совет
3 ответа
Вы должны создать подкласс UITableViewDiffableDataSource
и вернуться true
для строк, для которых вы хотите включить это:
override func tableView(_ tableView: UITableView, canEditRowAt indexPath: IndexPath) -> Bool
Это правда, что документы дляtableView(_:canEditRowAt:)
сказать:
Метод позволяет источнику данных исключать отдельные строки из обработки как редактируемые. Редактируемые строки отображают элементы управления вставкой или удалением в своих ячейках. Если этот метод не реализован, предполагается, что все строки доступны для редактирования.
Однако UITableViewDiffableDataSource
, Делает реализацию этого метода и, кажется, чтобы вернутьсяfalse
по умолчанию (хотя я нигде не могу найти этого документированного).
Фактически, пример кода из сессий 215 и 220 WWDC 2019 реализует пользовательскийUITableViewDiffableDataSource
подкласс вроде этого:
class DataSource: UITableViewDiffableDataSource<SectionType, ItemType> {
// ...
override func tableView(_ tableView: UITableView, canEditRowAt indexPath: IndexPath) -> Bool {
return true
}
// ...
}
Если ваш настраиваемый класс наследуется от другого настраиваемого
UITableViewDiffableDataSource
class, вам необходимо реализовать
trailingSwipeActionsConfigurationForRowAt
метод в родительском классе с
default
реализации, а затем переопределите ее в
child
class для вызова:
Родительский класс:
class ParentDataSource: UITableViewDiffableDataSource<SectionType, ItemType> {
// ...
override func tableView(_ tableView: UITableView, canEditRowAt indexPath: IndexPath) -> Bool {
return true
}
func tableView(_ tableView: UITableView, trailingSwipeActionsConfigurationForRowAt indexPath: IndexPath) -> UISwipeActionsConfiguration? {
return nil
}
// ...
}
Дочерний класс:
class ChildDataSource: ParentDataSource {
// ...
override func tableView(_ tableView: UITableView, trailingSwipeActionsConfigurationForRowAt indexPath: IndexPath) -> UISwipeActionsConfiguration? {
let lockedAction = UIContextualAction(style: .normal, title: "TEST") { (_, _, completion) in
print("tapped....")
completion(true)
}
return UISwipeActionsConfiguration(actions: [lockedAction])
}
// ...
}
У меня была такая же проблема, и это единственное решение, которое сработало для меня.