有什么方法可以滑动以删除/将操作添加到 UITableview Diffable 数据源中的单元格中?

Is there any way to swipe to delete/ Add actions into cell in UITableview Diffable datasource?

我正在尝试将滑动操作添加到我的表格视图中。当我使用简单的 tableview 数据源方法时,它工作正常 (trailingSwipeActionsConfigurationForRowAt)。但是当我用 Diffable 数据源尝试同样的事情时,它甚至没有调用滑动方法。我使用断点进行跟进,但没有用。 我正在使用 swift 5 (UIKit), Xcode 12.4

我通过以下方法解决了这个问题: 使用 diffable 数据源的 subclass 如下。

class GrocDataSource: UITableViewDiffableDataSource <GrocListSections, Grocs> {
override func tableView(_ tableView: UITableView, canEditRowAt indexPath: IndexPath) -> Bool {
    if indexPath.section == 0 || indexPath.section == 2 {
        return true
    } else {
        return false
    }
}

}

将此 class 实施到数据源中:

datasource = GrocDataSource(tableView: grocTableView, cellProvider: { (tableView, indexPath, grocs) in
guard let cell = tableView.dequeueReusableCell(withIdentifier: "GrocNameCell", for: indexPath) as? GrocNameCell else {return UITableViewCell()}
return cell })

写了一个demo,效果不错。

CustomDiffableDataSource.swift

import UIKit

enum Section: CaseIterable {
    case main
}

struct City: Hashable {
    var name: String
    let identifier = UUID()

    func contains(query: String?) -> Bool {
        guard let query = query else {
            return true
        }

        guard !query.isEmpty else {
            return true
        }

        return name.contains(query)
    }
}

class CustomDiffableDataSource: UITableViewDiffableDataSource<Section, City> {
    override func tableView(_ tableView: UITableView, canEditRowAt indexPath: IndexPath) -> Bool {
        true
    }

    override func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCell.EditingStyle, forRowAt indexPath: IndexPath) {
        print("delete")
        
        // get item data
        guard let item = itemIdentifier(for: indexPath) else {
            return
        }
        
        print("item: ", item)
    }
}

TableViewController.swift

import UIKit

class TableViewController: UITableViewController {
    lazy var cities: [City] = {
        let cityNames = ["A", "B", "C", "D", "E", "F", "G"]
        var cities = [City]()
        for name in cityNames {
            cities.append(City(name: name))
        }

        return cities
    }()

    var dataSource: UITableViewDiffableDataSource<Section, City>!

    override func viewDidLoad() {
        super.viewDidLoad()

        tableView.register(UITableViewCell.self, forCellReuseIdentifier: "cell")

        createDataSource()
    }

    func createDataSource() {
        dataSource = CustomDiffableDataSource(tableView: tableView, cellProvider: { tableView, _, city in
            let cell = tableView.dequeueReusableCell(withIdentifier: "cell")
            cell?.textLabel?.text = city.name

            return cell
        })

        dataSource.defaultRowAnimation = .fade

        show()
    }

    func show() {
        var snapshot = dataSource.snapshot()

        snapshot.appendSections([.main])
        snapshot.appendItems(cities, toSection: .main)

        dataSource.apply(snapshot, animatingDifferences: true)
    }
}