0

When you build a Cocoa App, you can add all the global methods and objects in AppDelegate class, and in any place of the code, you can get access to AppDelegate via

AppDelegate* appDlgt = (AppDelegate*)[[NSApplication sharedApplication] delegate];

But how can I do the same thing in a Cocoa Framework? It doesn't seem to have AppDelegete

Thanks

4

2 回答 2

2

像这样

+ (instancetype)sharedMyClass
{
    static id           kSharedMyClass = nil;
    static dispatch_once_t      theOnceToken;
    dispatch_once( &theOnceToken, ^{ kSharedMyClass = [[self alloc] init]; } );
    return kSharedMyClass;
}
于 2013-06-14T14:52:39.893 回答
1

NSApp 是你的 NSApplication 实例的快捷方式,它通常有一个委托,或者更古老的,一个可以存储数据的子类。

因此,如果您遵循默认项目模板:

((YourAppDelegate *)[NSApp delegate]).property

会带你去你想去的地方

不要滥用这一点,因为您应该只将属于应用程序的东西真正存储在委托中,即使这样,那些用户定义的属性也应该是 NSUserDefaults 或包含在其他一些控制器类中。

编辑:对不起,我有点错过了......如果您需要将更高级别的应用程序数据传递到一个框架中,那么您可以做很多事情,而不知道具体细节很难评论哪个最好...

一些选项:

使用您感兴趣的属性在框架中定义一个协议,在您的委托中采用该协议。

然后((id <FrameworkProtocol>)NSApp.delegate).protoProperty会工作。

但这引入了委托采用该协议的要求,您可以使用 conformsToProtocol: 方法进行检查。

于 2013-06-15T14:40:17.723 回答