在我的Cocoa应用程序中,我有两个需要连接的NIB / XIB文件:
MainMenu.xib :包含NSApplication委托对象的自定义对象,并将其连接到NSApplication
占位符中的相应插座。
ContextMenu.xib :设置NSMenu
;一个条目应该打开首选项对话框
我的自定义应用委托定义IBAction
以显示我的应用的首选项窗口。
如何连接NSMenuItem(第二个NIB)以显示应用程序委托(第一个NIB)中定义的操作的首选项?
Docs说这应该很容易,但他们没有提到在Interface Builder中如何做到这一点:
如果菜单项引用了应用程序级命令,则可以 直接在应用程序委托中执行该命令或只是 让代理将消息转发给适当的对象 你申请中的其他地方。
我不知何故需要在第二个NIB中访问app委托,告诉Interface Builder它是我的自定义类(因此它知道自定义IBAction),并将其连接到菜单项的操作。
感谢您的任何指示!
答案 0 :(得分:3)
如果其他对象在响应者链中,那么您可以将操作挂钩到第一个响应者。
但请注意“if”。
正如Maurice Kelly所提到的,您的App Delegate已经是响应者链的一部分,因此您可以使用它:在First Responder上定义一个自定义操作(在Interface Builder中),并在App Delegate上执行相应的操作。但是,如果您有许多操作可能会使App Delegate混乱,那么您可能只想将此架构用于简单的应用程序。
答案 1 :(得分:1)
对于第二个NIB中的绑定,可以通过使用以Application
开头的模型密钥路径绑定到delegate
来访问应用程序委托绑定。即delegate.managedObjectContext
警告:不要在第二个NIB中创建应用程序委托对象。如果这样做,您将最终得到第二个应用程序委托实例和第二个单独的managedObjectContext。 NIB创建另一个应用程序委托对象。这太糟糕了。
在加载MainMenu.xib时,[NSApplication sharedApplication]
将其委托设置为在MainMenu.xib中实例化的委托对象。如果在另一个NIB中创建委托对象,则会有一个与[NSApp delegate]
不匹配的委托对象。 (你会把自己的头撞到墙上试图发现为什么上下文的观点不会更新)
答案 2 :(得分:0)
您的第二个NIB将拥有一个文件所有者,您应将其设置为由您的应用程序实例化的类。在这个类中,您可以创建对App Delegate的引用,可以在实例化类时填写(例如,如果您是在委托中创建它,则使用setAppDelegate:self
。)
在此类中创建一个IBAction,它只是将操作传递给App Delegate:
- (IBAction) passItOnAction:(id)sender {
[appDelegate openPreferences:sender];
}
答案 3 :(得分:0)
我遇到了同样的问题,并解决了这个问题:
我只创建了一个菜单(MainMenu.xib)。由于第一响应者未提供任何操作的菜单项会自动显示为灰色,因此在激活Prefs窗口时,文档窗口中的项目将显示为灰色。
我为prefs窗口的定义创建了一个PrefsWin.xib。该xib的文件所有者是一个名为PrefsWinController的类,它继承自NSWindowController。
MainMenu.xib中的操作只是连接到First Responder而不是委托。如果你的实例是< NSApplicationDelegate>是NSResponder的一个实例,代理将自动充当链中的最后一个响应者。 (我不知道这可能记录在哪里,但它肯定适用于我的项目。)