如何在SwiftUI中实现获取顶层可见视图的功能?
在SwiftUI中获取顶层可见视图控制器
SwiftUI是声明式UI框架,本身没有直接对应"顶层视图控制器"的概念,但可以通过桥接UIKit的方式实现和你提供的UIKit代码相同的功能。需要注意的是,iOS 13之后keyWindow被弃用,我们需要从活跃场景中获取关键窗口,以下是适配的实现方案:
方案1:工具函数实现
import UIKit func getTopViewController() -> UIViewController? { // 获取当前活跃的前台场景 guard let activeScene = UIApplication.shared.connectedScenes.first(where: { $0.activationState == .foregroundActive }) as? UIWindowScene else { return nil } // 获取场景中的关键窗口及根控制器 guard let rootVC = activeScene.windows.first(where: { $0.isKeyWindow })?.rootViewController else { return nil } // 遍历找到最顶层的presented控制器 var topController = rootVC while let presentedVC = topController.presentedViewController { topController = presentedVC } return topController }
方案2:UIApplication扩展封装
更符合Swift编码风格的方式是封装成UIApplication的扩展:
import UIKit extension UIApplication { var topViewController: UIViewController? { guard let activeScene = connectedScenes.first(where: { $0.activationState == .foregroundActive }) as? UIWindowScene else { return nil } guard let rootVC = activeScene.windows.first(where: { $0.isKeyWindow })?.rootViewController else { return nil } var topController = rootVC while let presentedVC = topController.presentedViewController { topController = presentedVC } return topController } }
在SwiftUI中使用
无论哪种方案,都可以直接在SwiftUI的视图逻辑中调用:
struct ContentView: View { var body: some View { Button("获取顶层控制器") { // 使用工具函数 if let topVC = getTopViewController() { print("顶层控制器:\(topVC)") } // 或者使用扩展属性 if let topVC = UIApplication.shared.topViewController { print("顶层控制器:\(topVC)") } } } }
内容的提问来源于stack exchange,提问作者Pranit
相关产品推荐
相关产品推荐

