在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...
这里有两个关键问题:
- 只创建了导航控制器并push了VC,但没有将导航控制器设置为window的
rootViewController,导致你的视图控制器没有被加载到App的视图层级中。 - 用空的
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
相关产品推荐
相关产品推荐

