iOS中keyWindow与windows已弃用,获取根视图控制器遇报错求解决
iOS 13+ 正确获取顶层根视图控制器的方法
针对你遇到的keyWindow、windows弃用警告,以及直接调用UIWindowScene.windows报错的问题,下面是适配iOS 13到最新系统的解决方案:
完整实现代码
// 1. 获取当前处于前台活跃状态的窗口场景 guard let activeScene = UIApplication.shared.connectedScenes .first(where: { $0.activationState == .foregroundActive }) as? UIWindowScene else { // 场景不存在时的 fallback 处理,比如App在后台时 fatalError("无法获取活跃的窗口场景") } // 2. 从活跃场景中找到key window guard let keyWindow = activeScene.windows.first(where: { $0.isKeyWindow }) else { fatalError("找不到当前的key window") } // 3. 获取根视图控制器 let topController = keyWindow.rootViewController!
错误原因说明
- 你之前用
UIWindowScene.windows报错,是因为windows是UIWindowScene实例对象的属性,不是类本身的静态属性,必须先拿到当前具体的窗口场景实例,才能访问它的窗口集合。 - iOS 13引入多场景机制后,
UIApplication.shared.keyWindow和UIApplication.shared.windows被弃用,因为一个应用可能同时存在多个窗口场景(比如iPad分屏、Mac Catalyst多窗口),全局方法无法精准定位到当前用户交互的场景窗口。
新手友好提示
- 尽量少用强制解包
!,如果不确定对象是否存在,用guard let或if let做可选绑定,避免运行时崩溃;只有在逻辑上能确保对象一定存在时,再使用强制解包。 - 如果你的需求是获取当前显示的顶层视图控制器(而非根控制器,比如导航栈的顶部控制器、TabBar选中的控制器),可以给
UIViewController写一个扩展方法,不过当前你要的根控制器,用上面的代码即可。
内容的提问来源于stack exchange,提问作者user19534819
相关产品推荐
相关产品推荐

