如何从 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
我知道如何访问场景委托:
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