3

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

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

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

我的自定义应用程序委托定义了一个IBAction为我的应用程序调出首选项窗口。

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

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

如果菜单项引用应用程序级命令,您可以直接在应用程序委托中实现该命令,或者只是让委托将消息转发到应用程序中其他位置的适当对象。

我需要以某种方式访问​​第二个 NIB 中的应用程序委托,告诉 Interface Builder 它属于我的自定义类(因此它知道自定义 IBAction),并将其连接到菜单项的操作。

感谢您的任何指点!

4

4 回答 4

3

如果其他对象在响应者链中,那么您可以将操作连接到第一个响应者。

不过,请注意“如果”。

正如 Maurice Kelly 所提到的,您的 App Delegate 已经是响应者链的一部分,因此您可以使用它:在 First Responder 上定义一个自定义操作(在 Interface Builder 中),并在您的 App Delegate 上定义一个相应的操作。但是,如果您有许多可能会使 App Delegate 混乱的操作,那么您可能只想将此架构用于简单的应用程序。

于 2011-09-13T08:48:05.230 回答
1

对于第二个 NIB 中的绑定,可以通过使用Applicationdelegate. IEdelegate.managedObjectContext

警告:不要在第二个 NIB 中创建应用委托对象。 如果这样做,您最终将获得第二个应用程序委托实例,其中包含第二个单独的 managedObjectContext。NIB 创建另一个应用程序委托对象。这真糟糕。

在加载 MainMenu.xib 时,[NSApplication sharedApplication]将其委托设置为在 MainMenu.xib 中实例化的委托对象。如果您在另一个 NIB 中创建委托对象,您将拥有一个不匹配的委托对象[NSApp delegate]。(而且你会把头撞到墙上,试图发现为什么上下文的视图没有更新)

于 2014-04-04T19:30:54.957 回答
0

您的第二个 NIB 将有一个文件所有者,您应该将其设置为由您的应用程序实例化的类。在此类中,您可以创建对 App Delegate 的引用,可以在实例化类时填写该引用(例如,setAppDelegate:self如果您从委托中创建它,则使用)。

在此类中创建一个 IBAction,它只是将操作传递给 App Delegate:

- (IBAction) passItOnAction:(id)sender {
    [appDelegate openPreferences:sender];
}
于 2011-09-13T08:19:19.707 回答
0

我遇到了同样的问题,并像这样解决了它:

  • 我只创建了一个菜单(MainMenu.xib)。由于第一响应者未提供任何操作的菜单项会自动显示为灰色,因此在激活“首选项”窗口时,用于“文档”窗口的项目将显示为灰色。

  • 我为首选项窗口的定义创建了一个 PrefsWin.xib。该 xib 的 File's Owner 是一个名为 PrefsWinController 的类,它继承自 NSWindowController。

  • MainMenu.xib 中的操作只是连接到 First Responder 而不是委托。如果您的 <NSApplicationDelegate> 实例是 NSResponder 的实例,则委托将自动充当链中的最后一个响应者。(我不知道这可能会记录在哪里,但它确实适用于我的项目。)

于 2013-07-28T09:47:34.963 回答