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

在Window上显示Alert时遇到问题,附APP根视图控制器设置代码

解决iOS中Alert无法显示的问题(结合根视图控制器设置)

嘿,看你贴的代码和遇到的Alert显示问题,大概率是根视图控制器的设置逻辑不完整导致的!你当前的代码只创建了导航控制器并push了视图控制器,但没把这个导航控制器挂载到App的window上,这会让你的视图不在正确的视图层级里,Alert自然没法正常弹出。

先看你代码里的问题点

你原来的代码片段:

let navController = UINavigationController() //App Theming
navController.navigationBar.barTintColor = Constant.AppColor.navigationColor
navController.navigationBar.tintColor = Constant.AppColor.navigationBarTintColor
navController.navigationBar.titleTextAttributes = [NSAttributedStringKey.foregroundColor: Constant.AppColor.navigationColorTextColor]
navController.pushViewController(viewContoller, animated: true)
let appDelegate = UIAppli...

这里有两个关键问题:

  1. 只创建了导航控制器并push了VC,但没有将导航控制器设置为window的rootViewController,导致你的视图控制器没有被加载到App的视图层级中。
  2. 用空的UINavigationController()初始化再push的方式不够规范,推荐直接用目标VC作为根来初始化导航控制器。

修正后的完整代码

针对iOS 12及之前(用AppDelegate)

// 先确保你已经实例化了目标视图控制器,比如:
let viewContoller = YourTargetViewController()

// 直接用目标VC作为根初始化导航控制器
let navController = UINavigationController(rootViewController: viewContoller)

// 导航栏主题设置
navController.navigationBar.barTintColor = Constant.AppColor.navigationColor
navController.navigationBar.tintColor = Constant.AppColor.navigationBarTintColor
// 注意:NSAttributedStringKey在Swift 4.2+已经改为NSAttributedString.Key
navController.navigationBar.titleTextAttributes = [NSAttributedString.Key.foregroundColor: Constant.AppColor.navigationColorTextColor]

// 将导航控制器设置为window的根视图控制器
if let appDelegate = UIApplication.shared.delegate as? AppDelegate, let window = appDelegate.window {
    window.rootViewController = navController
    window.makeKeyAndVisible()
}

针对iOS 13+(用SceneDelegate)

如果你的项目是iOS 13及以上,根视图控制器要在SceneDelegate的scene(_:willConnectTo:options:)方法里设置:

func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
    guard let windowScene = (scene as? UIWindowScene) else { return }
    
    // 实例化目标VC和导航控制器
    let viewContoller = YourTargetViewController()
    let navController = UINavigationController(rootViewController: viewContoller)
    
    // 导航栏主题设置
    navController.navigationBar.barTintColor = Constant.AppColor.navigationColor
    navController.navigationBar.tintColor = Constant.AppColor.navigationBarTintColor
    navController.navigationBar.titleTextAttributes = [NSAttributedString.Key.foregroundColor: Constant.AppColor.navigationColorTextColor]
    
    // 配置window并设置根VC
    let window = UIWindow(windowScene: windowScene)
    self.window = window
    window.rootViewController = navController
    window.makeKeyAndVisible()
}

验证Alert是否能正常显示

在你的YourTargetViewController里,随便找个时机(比如viewDidAppear)添加Alert代码测试:

override func viewDidAppear(_ animated: Bool) {
    super.viewDidAppear(animated)
    
    let alert = UIAlertController(title: "测试", message: "Alert终于显示啦!", preferredStyle: .alert)
    alert.addAction(UIAlertAction(title: "确定", style: .default))
    present(alert, animated: true)
}

这样调整后,你的视图层级就正确了,Alert应该能正常弹出啦!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 04:17:38