目标c - 引用NSApp代表可可上的变量



所以我在这里有点困惑。我有一个Cocoa应用程序,在appdelegate标头中,我声明了一个NSDrawer,我已经在Interfacebuilder中连接了它,并且我根据上下文以编程方式设置其内容视图。内容视图包含连接到应用程序委托中各种功能的按钮。

@property (strong) IBOutlet NSDrawer *theDrawer;

当我的应用程序启动应用程序时,我在调试器中检查它"抽屉"不是零,并且由界面构建器正确实例化。在

现在,如果用户单击任何按钮,结果发现对[[NSApp delegate] theDrawer]的引用将被忽略,因为抽屉为零。我尝试通过在应用程序启动时专门设置委托来解决此问题。

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

我已经检查过self.theDrawer在这一点上不是零。但即使在我明确设置了委托之后,将来对 [[NSApp 委托] theDrawer] 的任何调用都是零。

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

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

任何帮助表示赞赏

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

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

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

但这无关紧要,因为如果您有第二个要为其创建插座的 NIB,它们属于您声明为该文件所有者的自定义视图控制器或窗口控制器子类。 即使第二个 NIB 立即加载,那么应用程序委托也应该实例化一个控制器实例来加载和拥有 NIB,如果你想要插座,它必须是自定义子类。

Apple 通过使应用程序委托类成为非文档应用程序中 MainMenu.xib 中主菜单"窗口"的所有者来打破这种模式......但那是因为菜单窗口有点特别。 你在 MainMenu.xib 之外所做的任何事情都需要一个自定义控制器类来拥有插座。

本回答中有关应用委托实例的其他讨论。

最新更新