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

Swift中点击AlertController后ViewController及TableView空值崩溃求助

解决AlertController弹出后无法获取当前ViewController及tableView的问题

核心问题分析

弹出AlertController后,常规顶层VC获取方法仅返回UINavigationController,原因是没有递归遍历导航控制器的topViewController、标签控制器的selectedViewController,以及模态弹出的控制器链(presentedViewController),导致无法定位到持有tableView的目标VC。

解决方案:实现正确的顶层ViewController获取方法

扩展UIApplication,通过递归遍历控制器层级,精准定位最顶层的可见ViewController:

extension UIApplication {
    func getTopViewController() -> UIViewController? {
        var topVC = keyWindow?.rootViewController
        // 遍历模态弹出的控制器链
        while let presentedVC = topVC?.presentedViewController {
            topVC = presentedVC
        }
        // 穿透导航控制器,获取栈顶VC
        while let navVC = topVC as? UINavigationController {
            topVC = navVC.topViewController
        }
        // 穿透标签控制器,获取选中的VC
        while let tabVC = topVC as? UITabBarController {
            topVC = tabVC.selectedViewController
        }
        return topVC
    }
}

使用方法

在AlertController的按钮Action中,调用该方法获取目标VC并强转,即可安全访问tableView:

let alert = UIAlertController(title: "提示", message: "操作确认", preferredStyle: .alert)
alert.addAction(UIAlertAction(title: "确定", style: .default) { _ in
    guard let currentVC = UIApplication.shared.getTopViewController() as? YourTargetViewController else {
        return
    }
    // 安全访问tableView
    currentVC.tableView.reloadData()
})
present(alert, animated: true)

额外注意点

  • 确保YourTargetViewController是当前导航栈的顶层控制器,避免强转失败
  • 如果AlertController是在当前ViewController的方法内弹出的,优先使用弱引用的self访问tableView,更简洁安全:
    alert.addAction(UIAlertAction(title: "确定", style: .default) { [weak self] _ in
        guard let self = self else { return }
        self.tableView.reloadData()
    })
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 16:07:37