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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 21:54:18