You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

UITableViewRowAction在iOS13.0已废弃,升级项目代码求适配方案

解决UITableViewRowAction在iOS13+废弃的适配问题

嗨,刚好碰到过这个适配问题!iOS 13开始UITableViewRowAction就被标记为废弃了,苹果推荐用**UITableView.ContextualAction**配合UITableView.SwipeActionsConfiguration来实现侧滑操作,比原来的API还更灵活些。下面是你代码修改后的完整版本:

func tableView(_ tableView: UITableView, trailingSwipeActionsConfigurationForRowAt indexPath: IndexPath) -> UISwipeActionsConfiguration? {
    // 创建删除操作的ContextualAction
    let deleteAction = UIContextualAction(style: .destructive, title: deleteActionTitle) { [unowned self] (action, view, completionHandler) in
        // 这里放你原来要执行的代码,比如删除数据、刷新表格
        // 示例:
        // self.dataSource.remove(at: indexPath.row)
        // tableView.deleteRows(at: [indexPath], with: .automatic)
        
        // 操作完成后一定要调用completionHandler告诉系统结束操作
        completionHandler(true)
    }
    
    // 把操作打包成配置返回
    let swipeConfig = UISwipeActionsConfiguration(actions: [deleteAction])
    // 如果不想让用户全滑一下就触发删除,可以把这个属性设为false
    swipeConfig.performsFirstActionWithFullSwipe = true
    return swipeConfig
}

几个关键的改动点:

  • 替换了原来的editActionsForRowAt方法,改用trailingSwipeActionsConfigurationForRowAt(如果是左侧滑操作,就用leadingSwipeActionsConfigurationForRowAt)
  • 用UIContextualAction替代UITableViewRowAction,闭包参数多了个completionHandler,必须调用它来收尾操作
  • 通过UISwipeActionsConfiguration可以配置更多侧滑行为,比如是否允许全滑触发第一个操作

要是需要兼容iOS13以下版本

如果你的项目还得支持iOS13之前的系统,可以同时保留新旧两个方法,加上版本判断就行:

// iOS13及以上用新方法
@available(iOS 13.0, *)
func tableView(_ tableView: UITableView, trailingSwipeActionsConfigurationForRowAt indexPath: IndexPath) -> UISwipeActionsConfiguration? {
    let deleteAction = UIContextualAction(style: .destructive, title: deleteActionTitle) { [unowned self] (_, _, completionHandler) in
        // 执行你的操作
        completionHandler(true)
    }
    return UISwipeActionsConfiguration(actions: [deleteAction])
}

// iOS13以下用旧方法
func tableView(_ tableView: UITableView, editActionsForRowAt indexPath: IndexPath) -> [UITableViewRowAction]? {
    let deleteRowAction = UITableViewRowAction(style: .destructive, title: deleteActionTitle) { [unowned self] (_, indexPath) in
        // 执行你的操作
    }
    return [deleteRowAction]
}

这样就能完美覆盖各个版本的iOS系统啦~

内容的提问来源于stack exchange,提问作者user1828845

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 08:24:24