如何从 ViewController 访问 SceneDelegate 中的自定义变量?

How can I access a custom variable in the SceneDelegate from the ViewController?

我知道如何访问场景委托:

self.view.window.windowScene.delegate

和 window:

UIScene *scene = [[[[UIApplication sharedApplication] connectedScenes] allObjects] firstObject];

if ([scene.delegate conformsToProtocol:@protocol(UIWindowSceneDelegate)]) {
    
    UIWindow *window = [(id <UIWindowSceneDelegate>)scene.delegate window];
}

但这两种方法都假定我没有对 SceneDelegate.h/.m 文件进行任何更改。

我创建了一个自定义工具栏,但我不知道如何从 viewController:

访问它

SceneDelegate.h

#import <UIKit/UIKit.h>

@interface SceneDelegate : UIResponder <UIWindowSceneDelegate, NSToolbarDelegate>

@property (strong) NSToolbar *mainToolbar;

@property (strong, nonatomic) UIWindow * window;

@end

我正在使用 NSToolbar,因为它是一个 Mac Catalyst 应用程序,也可以 运行 在 macOS 上。

以下是检查对象是否符合要求的方法class:

UIScene *scene = [[[[UIApplication sharedApplication] connectedScenes] allObjects] firstObject];
if ([scene.delegate isKindOfClass:SceneDelegate.class]) {
    SceneDelegate *delegate = (SceneDelegate *)scene.delegate;
    NSToolbar *toolbar = delegate.mainToolbar;
}

But both methods assume I haven't made any changes to the SceneDelegate.h/.m file.

为什么会这样?

因为您提供的代码 returns UIWindowSceneDelegate 的实例。但是你正在寻找 SceneDelegate 类型的对象来访问它的接口。所以你必须把它转换成你想要的界面。

那我该如何解决呢?

因此您可以在任何地方访问它,例如:

SceneDelegate.shared.myCustomProperty

通过定义一个简单的class方法:

+ (SceneDelegate *)shared {
    return (SceneDelegate *)UIApplication.sharedApplication.connectedScenes.allObjects.firstObject;
}

注意:不要忘记导入SceneDelegate.h并将shared 属性添加到它的界面。


你也可以像 (SceneDelegate *)self.view.window.windowScene.delegate