如何将菜单项连接到跨Nib文件在NSApplication委托中定义的自定义操作?

时间:2011-09-13 06:47:36

标签: cocoa interface-builder xib nsmenuitem nsapplication

在我的Cocoa应用程序中,我有两个需要连接的NIB / XIB文件:

  1. MainMenu.xib :包含NSApplication委托对象的自定义对象,并将其连接到NSApplication占位符中的相应插座。

  2. ContextMenu.xib :设置NSMenu;一个条目应该打开首选项对话框

  3. 我的自定义应用委托定义IBAction以显示我的应用的首选项窗口。

    如何连接NSMenuItem(第二个NIB)以显示应用程序委托(第一个NIB)中定义的操作的首选项?

    Docs说这应该很容易,但他们没有提到在Interface Builder中如何做到这一点:

      

    如果菜单项引用了应用程序级命令,则可以   直接在应用程序委托中执行该命令或只是   让代理将消息转发给适当的对象   你申请中的其他地方。

    我不知何故需要在第二个NIB中访问app委托,告诉Interface Builder它是我的自定义类(因此它知道自定义IBAction),并将其连接到菜单项的操作。

    感谢您的任何指示!

4 个答案:

答案 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的一个实例,代理将自动充当链中的最后一个响应者。 (我不知道这可能记录在哪里,但它肯定适用于我的项目。)