如何使用 Objective-C 在 iOS 13 中获取 rootViewController?

How to get rootViewController in iOS 13 using Objective-C?

我正在尝试使用 Objective-C 在 iOS 13 中获取 rootViewController。我正在做这样的事情:

for (UIScene *scene in UIApplication.sharedApplication.connectedScenes) {
    UIWindowScene *windowScene = (UIWindowScene *) scene;
    UIWindowSceneDelegate *windowSceneDelegate = (UIWindowSceneDelegate *) windowScene.delegate;
    windowSceneDelegate.window = ...
}

但是当我尝试访问 windowSceneDelegate.window = 中的 window 属性(以获取 rootViewController)时,出现以下错误:

Property 'window' cannot be found in forward class object 'UIWindowSceneDelegate'

但是当我转到 UIWindowSceneDelegate 的定义时,我看到 window 属性:

那么使用 Objective-C 在 iOS 13 中获取 rootViewController 的正确方法是什么?

将您的代码更改为:

for (UIScene *scene in UIApplication.sharedApplication.connectedScenes) {
    if ([scene.delegate conformsToProtocol:@protocol(UIWindowSceneDelegate)]) {
        UIWindow *window = [(id<UIWindowSceneDelegate>)scene.delegate window];
    }
}

当您打开 UIKits UIWindowScene.h 头文件时,它包含:

@class UIScreen, UIWindow, UIWindowSceneDelegate, UISceneDestructionRequestOptions, CKShareMetadata, UISceneSizeRestrictions;

看,UIWindowSceneDelegate。这是前向声明。

阅读 this answer 了解什么是前向声明。