我想在菜单栏上使用键盘快捷键cmd-1,cmd-2,cmd-3的三个菜单项。我知道怎么做。
每个菜单项都会打开一个不同的窗口(win1,win2,win3)。
我想要它,以便每个窗口只允许一次打开一个实例(即只有一个win1,一个win2等)。
如何最好地接近这个?
答案 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包含窗口控制器。)