我正在更新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,并且发生了同样的事情。
谢谢您的建议
答案 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])
}
// ...
}
我遇到了同样的问题,这是对我有用的唯一解决方案。