gpt4 book ai didi

objective-c - 在 NSApp 委托(delegate) Cocoa 上引用变量

转载 作者:行者123 更新时间:2023-12-03 17:52:09 25 4
gpt4 key购买 nike

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

@property (strong) IBOutlet NSDrawer *theDrawer;

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

现在,如果用户单击任何按钮,那么对 [[NSApp delegate] theDrawer] 的引用将被忽略,因为 theDrawer 为零。这对我来说没有意义。我尝试通过在应用程序启动时专门设置委托(delegate)来解决此问题。

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

我已经检查过 self.theDrawer 此时不为零。但即使在我显式设置委托(delegate)之后,任何 future 对 [[NSApp delegate] theDrawer] 的调用都是零。

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

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

感谢任何帮助

最佳答案

应用程序委托(delegate)已在 main.m 的 main 中正确设置,您可以在项目的“支持文件”文件夹中找到该文件。一般来说,它嵌入在 NSApplicationMain() 中,我相信它引用了 plist 中的 NSMainNibFile 并且实际上主 Nib 拥有应用程序委托(delegate)对象实例。然而,苹果公司并不完全清楚这些魔法是如何发挥作用的。尽管如此,您无法在 applicationDidFinishLaunching 中设置委托(delegate)——这是一个委托(delegate)函数!

但是,如果您使用的是 NSMainNibFile 和非文档应用程序,则应用程序委托(delegate)可能会被设置为主 NIB 中的一个对象...在该 NIB 中,“文件所有者” "也是应用程序委托(delegate)类,并且 [NSApp delegate] 中的其他导出不为零,因为它是主 NIB 文件的所有者。从 NSMainNibFile 中,您可以在 App Delegate 类中创建导出,因为它是文件的所有者。

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

但这无关紧要,因为如果您要为其创建第二个 NIB,它们属于您已声明为该文件所有者的自定义 View Controller 或窗口 Controller 子类。即使第二个 NIB 会立即加载,然后应用程序委托(delegate)应该实例化一个 Controller 实例来加载并拥有 NIB,如果您想要 socket ,它必须是自定义子类。

Apple 通过使应用程序委托(delegate)类成为非文档应用程序中 MainMenu.xib 中主菜单“窗口”的所有者来打破这种模式......但这是因为菜单窗口有点特殊。您在 MainMenu.xib 之外执行的任何操作都需要自定义 Controller 类才能具有导出。

Additional discussion in this answer关于应用程序委托(delegate)实例。

关于objective-c - 在 NSApp 委托(delegate) Cocoa 上引用变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23302383/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com