【发布时间】:2014-04-26 08:32:57
【问题描述】:
所以我在这里有点困惑。我有一个 Cocoa 应用程序,在 appdelegate 标头中,我声明了一个已在 Interfacebuilder 中连接的 NSDrawer,并且我正在根据上下文以编程方式设置其 contentView。内容视图包含连接到 Appdelegate 中各种功能的按钮。
@property (strong) IBOutlet NSDrawer *theDrawer;
当我的应用程序启动应用程序并在调试器中检查它时,“theDrawer”不是 nil 并且由 Interfacebuilder 正确实例化。在
现在,如果用户单击任何按钮,就会发现对 [[NSApp delegate] theDrawer] 的引用将被忽略,因为 theDrawer 为 nil。这对我来说没有意义。我尝试通过在应用启动时专门设置委托来解决此问题。
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
[NSApp setDelegate:self];
}
我已经检查过 self.theDrawer 在那一点上不为零。但即使在我明确设置委托之后,任何未来对 [[NSApp delegate] theDrawer] 的调用都是零。
如何确保访问我的 App 委托上的变量?我的理解是调用 NSapp 委托将返回应用程序的唯一实例。
似乎当用户单击一个按钮时,这会创建一个新线程,并且 NSApp 委托将为所有变量返回 nil。
任何帮助表示赞赏
【问题讨论】:
-
您不应该为此使用应用程序委托(这不是该类的用途)。为drawer属性添加一个带断点的setter,什么时候调用?
-
我还应该在哪里放置一个我需要从应用程序的任何地方访问的变量? setter 在主线程启动后直接调用
-
如果是视图类型对象,则在加载NIB的关联窗口或窗口控制器中声明出口。 NSApplication 和委托的存在是为了桥接应用程序和系统事件,而不是作为全局状态桶。
标签: objective-c cocoa delegates