我想在菜单栏上有三个菜单项,快捷键是cmd-1,cmd-2,cmd-3。我知道该怎么做。
每个菜单项将打开一个不同的窗口(win1、win2、win3)。
我想让它在任何时候只允许每个窗口的一个实例打开(即只有一个win1,一个win2,等等)。
如何更好地实现这一点呢?
发布于 2010-05-19 06:49:22
如果有问题的窗口在MainMenu.nib中,这很简单;在每个窗口上将操作附加到-makeKeyAndOrderFront:。
另一方面,如果它们不在MainMenu.nib中(如果您的应用程序是以正常的方式构建的,则更有可能出现这种情况),事情就会变得稍微复杂一些。长话短说;您需要将菜单项操作附加到某种形式的控制器对象上的适当方法(最有可能是您的应用程序委托,尽管任何“看到”所有需要的nib的控制器都可以);然后让有问题的控制器向其窗口发送类似的消息。
这通常是一种明智的方法,因为您可以将较小的控制器对象附加到您的窗口,如果合适的话,这些控制器对象还可以充当相关窗口中各种视图的数据源。
它还允许延迟加载窗口,这在最后一次统计中是一件好事™。
如果这是某种面向文档(不一定是基于文档)的应用程序,并且窗口显示了当前选择的“文档”或数据片段的某些属性,那么在MainMenu.nib中子类化NSWindowController并加载窗口控制器可能是一个很好的起点。
注意:如果负责控制窗口的对象位于响应器链中,则甚至不需要在MainMenu.nib中引用它们;您只需将用于打开窗口的MainMenu.nibIBAction(例如openDetailsWindow:或类似对象)附加到虚拟FirstResponder对象。(只需将选择器添加到它的已知方法列表中,就可以了。)
Reedit:要使窗口不出现在窗口菜单中,可以调用[window setExcludedFromWindowsMenu:YES]。
选中/取消选中菜单项有点棘手,因为它需要您的窗口控制器实际了解菜单项;但只要是这样,它就非常简单;使用相关的状态名称(NSOffState,NSOnState)调用-setState:,例如,从显示/关闭窗口时调用的委托方法。(同样,这可以封装在应用程序委托中;如果您出于任何原因不想让MainMenu.nib包含窗口控制器。)
https://stackoverflow.com/questions/2861512
复制相似问题