Невозможно провести пальцем по экрану, чтобы удалить с помощью 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])
    }
    // ...
}

У меня была такая же проблема, и это единственное решение, которое сработало для меня.

Другие вопросы по тегам