从菜单项创建窗口

时间:2010-05-18 22:10:24

标签: objective-c cocoa xcode interface-builder

我想在菜单栏上使用键盘快捷键cmd-1,cmd-2,cmd-3的三个菜单项。我知道怎么做。

每个菜单项都会打开一个不同的窗口(win1,win2,win3)。

我想要它,以便每个窗口只允许一次打开一个实例(即只有一个win1,一个win2等)。

如何最好地接近这个?

1 个答案:

答案 0 :(得分:4)

如果有问题的窗口在MainMenu.nib中,那很简单;将操作附加到每个窗口的-makeKeyAndOrderFront:

另一方面,如果他们在MainMenu.nib中,那么如果您的应用程序以理智的方式构建,则更有可能出现这种情况;事情变得复杂一些。长话短说;您需要将菜单项操作附加到某种控制器对象上的适当方法(很可能是您的应用程序委托,尽管任何“看到”所有必需的笔尖都会执行的控制器);然后让有问题的控制器向其窗口发送类似的消息。

这通常是一种明智的方法,因为您可以将较小的控制器对象附加到您的窗口,如果合适,它们也可以作为相关窗口中各种视图的数据源。

它还允许延迟加载窗口,这是最后一次计算好的东西。

如果这是某种面向文档(不一定是基于文档的)应用程序的方式,则窗口显示当前所选“文档”或数据片段的某些属性;子类化NSWindowController并在MainMenu.nib中加载窗口控制器可能是一个很好的起点。

注意:如果负责控制Windows的对象存在于响应者链中,则甚至不需要在MainMenu.nib中引用它们。您可以将用于打开窗口的具有适当名称的 IBAction(例如openDetailsWindow:等)附加到虚拟的FirstResponder对象。 (只需将选择器添加到已知方法列表中,您就是金色。)

Reedit:要使窗口不显示在Windows菜单中,您可以拨打[window setExcludedFromWindowsMenu:YES]

检查/取消选中菜单项有点诡计,因为它需要你的窗口控制器实际知道菜单项;但只要是这种情况,它就会很简单;使用相关的州名(-setState:NSOffState)调用NSOnState,例如,在显示/关闭窗口时调用的委托方法。 (这可以再次封装在应用程序委托“内部”;如果您出于任何原因不希望MainMenu.nib包含窗口控制器。)