28

我正在更新 aUITableViewController以使用新的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])
}

但这在UITableViewControllerUITableViewDiffableDataSource

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

我认为这是一个 beta 错误,但我更新到 Xcode 11 GM 并且同样的事情正在发生。

感谢您的任何建议

4

3 回答 3

47

确实,文档tableView(_:canEditRowAt:)说:

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

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

事实上,来自 WWDC 2019 会议 215 和 220的示例代码UITableViewDiffableDataSource实现了一个自定义子类,如下所示:

class DataSource: UITableViewDiffableDataSource<SectionType, ItemType> {
    // ... 
    override func tableView(_ tableView: UITableView, canEditRowAt indexPath: IndexPath) -> Bool {
        return true
    }
    // ...
}
于 2019-09-26T12:24:38.023 回答
40

您应该为要启用此功能的行进行子类化UITableViewDiffableDataSource并返回:true

override func tableView(_ tableView: UITableView, canEditRowAt indexPath: IndexPath) -> Bool
于 2019-09-14T14:20:41.213 回答
-1

如果您的自定义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])
    }
    // ...
}

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

于 2021-08-04T17:17:20.060 回答