2010-05-18 91 views
1

我想用键盘快捷键cmd-1,cmd-2,cmd-3在菜单栏上选择三个菜单项。这我知道该怎么做。从菜单项创建一个窗口

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

我希望它,以便只有一个每个窗口的实例被允许在任何一次打开(即只有一个WIN1,一个WIN2等)。

这是最好的方法吗?

回答

4

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

如果,另一方面,他们在不MainMenu.nib中,因为更容易,如果你的应用程序在一个健全的方式构成的情况;事情变得更复杂一点。长话短说;您需要将菜单项操作附加到某种控制器对象的适当方法(很可能是您的应用程序委托,尽管任何“看到”所有需要的笔尖的控制器都会这样做);然后让控制器发送类似的消息到其窗口。

这通常是一个明智的做法,因为你可以连接到您的Windows较小控制器对象也采取行动,如果合适的话,作为在有关窗口的各种视图的数据源。

它还允许窗口的延迟加载,这是在最近的一次统计,好东西™。

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

备注:如果负责控制窗口的对象存在于响应者链中,则甚至不需要在MainMenu.nib中引用它们;你可以附加用来打开窗户到虚拟FirstResponder对象适当命名IBAction秒(例如openDetailsWindow:或类似物)。 (只需将选择添加到其已知的方法列表,你是金色的。)

重新编辑:使窗口不会出现在Windows菜单,你可以调用[window setExcludedFromWindowsMenu:YES]

要检查/取消选中的菜单项是需要一点小技巧,因为它需要你的窗口控制器实际上不知道有关的菜单项;但只要是这种情况,它就很简单了;请拨打-setState:,与相关的州名(NSOffState,NSOnState),例如从窗口显示/关闭时调用的委托方法中调用。 (这可能会再次被封装“内部”的应用程序委托;如果出于某种原因不想让你的MainMenu.nib中包含的窗口控制器。)

+0

在一个相关的说明。如果您在iTunes Window菜单项中查看,则可以启动两个窗口(iTunes和Equalizer)。当显示这些窗口中的任何一个(或两者)时,它们旁边会出现一个勾号来指示这一点。此外,这两个窗口的标题不会再出现在窗口菜单项中。我会如何模仿这个? – Garry 2010-05-19 06:04:45

+0

答复已更新;我建议你将注释提取到你原来的问题中(使用编辑按钮)。让人们稍后可以更轻松地找到信息。 :) – 2010-05-19 07:49:37