Swift中UITableView的editActionsForRowAt与trailingSwipeActionsConfigurationForRowAt区别及优势对比
嘿,刚接触Swift就琢磨UITableView的侧滑细节,挺认真的呀!我来给你把这俩方法的区别、优劣势掰扯清楚~
核心区别与优劣势分析
1. 出身与版本兼容性
editActionsForRowAt是iOS 8就推出的老派API,属于UITableView的传统编辑体系;trailingSwipeActionsConfigurationForRowAt是iOS 11才上线的新API,属于UISwipeActionsConfiguration这套更现代的交互框架。
说白了,如果你的APP必须兼容iOS 10及以下的老系统,那只能用老方法;但现在绝大多数APP都只支持iOS 13+了,新方法才是主流选择。
2. 交互样式与功能灵活性
这是两者最核心的差异:
老方法(editActionsForRowAt)
- 返回的是
UITableViewRowAction数组,每个按钮的样式比较固定:默认是红色破坏性按钮,只能自定义背景色和文字; - 侧滑出来的按钮是一排排列,用户点击就触发动作,没有“完全侧滑直接执行”的特性,取消侧滑只能手动滑回去,体验一般;
- 只能处理右侧的侧滑动作,左侧没法通过这个方法实现。
代码示例:
override func tableView(_ tableView: UITableView, editActionsForRowAt indexPath: IndexPath) -> [UITableViewRowAction]? { let deleteAction = UITableViewRowAction(style: .destructive, title: "删除") { [weak self] action, indexPath in self?.dataList.remove(at: indexPath.row) tableView.deleteRows(at: [indexPath], with: .automatic) } // 可以自定义背景色 deleteAction.backgroundColor = .systemRed return [deleteAction] }
新方法(trailingSwipeActionsConfigurationForRowAt)
- 返回的是
UISwipeActionsConfiguration,内部包含UIContextualAction数组,支持更多样式:比如可以设置按钮是.destructive(红色)还是.normal(默认灰色),还能给按钮加图标; - 支持
performsFirstActionWithFullSwipe属性:开启后用户完全侧滑一行,就会直接触发第一个动作,这是老方法没有的便捷交互; - 配套还有
leadingSwipeActionsConfigurationForRowAt方法,专门处理左侧侧滑,轻松实现左右两侧不同的侧滑动作; - 动作完成后需要调用
completionHandler告诉系统状态,逻辑更清晰。
代码示例:
override func tableView(_ tableView: UITableView, trailingSwipeActionsConfigurationForRowAt indexPath: IndexPath) -> UISwipeActionsConfiguration? { let deleteAction = UIContextualAction(style: .destructive, title: "删除") { [weak self] action, view, completionHandler in self?.dataList.remove(at: indexPath.row) tableView.deleteRows(at: [indexPath], with: .automatic) completionHandler(true) // 标记动作完成 } // 可选:给按钮加图标 deleteAction.image = UIImage(systemName: "trash") let configuration = UISwipeActionsConfiguration(actions: [deleteAction]) // 开启完全侧滑直接执行 configuration.performsFirstActionWithFullSwipe = true return configuration }
3. 性能差异
其实两者的性能差异几乎可以忽略不计——都是UITableView官方提供的代理方法,苹果内部都做了优化。除非你在创建action的逻辑里写了特别重的同步代码(比如同步加载网络数据),那是你的代码问题,不是方法本身的性能问题。
4. 该选哪一个?
- 如果不需要兼容iOS 10及以下,优先选新方法:交互体验更好,功能更全,也是苹果官方推荐的方向,后续的UIKit更新也会围绕新API迭代;
- 老方法的“通用性”只限于老系统兼容场景,现在已经属于被逐步淘汰的API了,没必要在新项目里用它。
内容的提问来源于stack exchange,提问作者user3628240
相关产品推荐
相关产品推荐

