无法在iOS 13中使用可扩散数据源通过TableView滑动以删除

时间:2019-09-11 23:45:10

标签: swift uitableview ios13 diffabledatasource

我正在更新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的{​​{1}}中不起作用

没有滑动,方法中的断点也不会被调用

我以为这是一个Beta错误,但是我更新为Xcode 11 GM,并且发生了同样的事情。

谢谢您的建议

3 个答案:

答案 0 :(得分:11)

您应该为UITableViewDiffableDataSource子类化,并为要在其中启用此功能的行返回true

override func tableView(_ tableView: UITableView, canEditRowAt indexPath: IndexPath) -> Bool

答案 1 :(得分:6)

docs for tableView(_:canEditRowAt:)确实说:

  

该方法允许数据源将单个行排除在可编辑范围之外。可编辑的行在其单元格中显示插入或删除控件。如果未实现此方法,则假定所有行都是可编辑的

但是UITableViewDiffableDataSource确实实现了该方法,并且默认情况下似乎返回了false(尽管我在任何地方都找不到该文档)。

实际上,来自WWDC 2019会议215和220的sample code实现了一个自定义UITableViewDiffableDataSource子类,如下所示:

class DataSource: UITableViewDiffableDataSource<SectionType, ItemType> {
    // ... 
    override func tableView(_ tableView: UITableView, canEditRowAt indexPath: IndexPath) -> Bool {
        return true
    }
    // ...
}

答案 2 :(得分:0)

如果您的自定义 UITableViewDiffableDataSource 类继承自另一个自定义 UITableViewDiffableDataSource 类,则需要使用 trailingSwipeActionsConfigurationForRowAt 实现在父类中实现 default 方法,然后在child 类以便被调用:

父类:

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])
    }
    // ...
}

我遇到了同样的问题,这是对我有用的唯一解决方案。