在NSApp委托Cocoa上引用变量

时间:2014-04-25 20:25:25

标签: objective-c cocoa delegates

所以我在这里有点困惑。我有一个Cocoa应用程序,在appdelegate标题中我声明了一个我在Interfacebuilder中连接的NSDrawer,其contentView我根据上下文以编程方式设置。 contentview包含连接到Appdelegate中各种功能的按钮。

@property (strong) IBOutlet NSDrawer *theDrawer;

当我的应用程序启动app时,我在调试器中检查它“theDrawer”并不是nil并且由Interfacebuilder正确实例化。在

现在,如果用户单击任何按钮,则会忽略对[[NSApp delegate] theDrawer]的引用,因为Drawer为nil。这对我没有意义。我尝试通过在应用启动时专门设置代理来解决此问题。

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
  [NSApp setDelegate:self];
}

我已经检查过self.theDrawer当时不是零。但即使我明确设置了委托,以后对[[NSApp委托] theDrawer]的任何调用都是零。

如何确保在我的App代理上访问变量?我的理解是,对NSapp委托的调用将返回该应用程序的唯一实例。

似乎当用户点击按钮时,这会创建一个新线程,NSApp委托将为所有变量返回nil。

任何帮助表示赞赏

1 个答案:

答案 0 :(得分:1)

应用程序委托在main.m中的main中正确设置,您可以在"支持文件"中找到它。项目的文件夹。通常它嵌入在NSApplicationMain()中,我相信在plist中引用NSMainNibFile并且实际上主nib拥有app委托对象实例。然而,苹果并不完全清楚所有这些魔法是如何起作用的。尽管如此,您无法在applicationDidFinishLaunching中设置委托 - 这是委托功能!

但是,如果您正在使用NSMainNibFile和非文档应用程序,则应用程序委托很可能被设置为主NIB中的对象...在该NIB中,"文件所有者" 也是应用程序委托类,其他出口在[NSApp委托]中是非零的,因为它是主要的NIB文件的所有者。从NSMainNibFile可以在App Delegate类中创建出口,因为它是文件的所有者。

如果您创建第二个NIB,则访问该委托时会出现问题。您不想创建对象,因为它与[NSApp委托]不是同一个对象。您可以使用Application占位符对象并使用" application.delegate的键路径绑定。"但是您无法创建商店,因为应用代表不能成为文件的所有者。

但那是无关紧要的,因为如果你有第二个NIB,你正在为它创建插座,它们属于你已声明的自定义视图控制器或窗口控制器子类,那个文件& #39; s owner。即使第二个NIB被立即加载,那么app委托应该实例化一个控制器实例来加载和拥有NIB,如果你想要出口,它必须是一个自定义的子类。

Apple通过让app delegate类成为主菜单" window"的所有者来打破这种模式。在非文档应用程序的MainMenu.xib中...但这是因为菜单窗口有点特殊。你在MainMenu.xib之外做的任何事情都需要一个自定义控制器类才能有出口。

关于app delegate实例的

Additional discussion in this answer