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
相关产品推荐
相关产品推荐

