我想在我的 Mac 应用程序的菜单栏中有一个图标 - 该图标应在单击时生成一个菜单。虽然在菜单中有更多条目,但我希望将顶行作为通用文本输入字段 - 就像在 Spotlight 中一样:
http://dl.dropbox.com/u/3943878/_mine/Screen%20shot%202011-07-16%20at%2012.29.18.png
是否可以将这样的字段添加到NSMenu
?或者我应该把它作为一个面板式窗口吗?
我想在我的 Mac 应用程序的菜单栏中有一个图标 - 该图标应在单击时生成一个菜单。虽然在菜单中有更多条目,但我希望将顶行作为通用文本输入字段 - 就像在 Spotlight 中一样:
http://dl.dropbox.com/u/3943878/_mine/Screen%20shot%202011-07-16%20at%2012.29.18.png
是否可以将这样的字段添加到NSMenu
?或者我应该把它作为一个面板式窗口吗?
如果您使用的是 xcode 4 ,请在界面生成器中创建自定义视图并添加文本字段或您想要的任何内容。在 IB 中,还可以从对象库中拖放一个“菜单”,其中包含您想要的任意数量的项目。然后只需 ctrl+单击您想要在文本字段中创建的菜单项(在您的情况下,它将是顶部的)并拖动到自定义视图并选择“视图”。现在,当您打开菜单时,它不会在该空间中显示菜单项,而是显示自定义视图中的任何内容。
编辑:至于您的评论,这是您应该做的。通过打开助手编辑器视图并 ctrl+单击从菜单到要使用的头文件,使您的菜单成为一个出口。现在,只需创建一个在菜单打开时都会运行的方法,方便的是苹果已经做到了,它被称为 menuWillOpen。
- (void)menuWillOpen: nameOfYourMenu{
[self performSelector:@selector(methodExecutedWhenMenuIsClicked) withObject:nil afterDelay:0.0 inModes:[NSArray arrayWithObject:NSRunLoopCommonModes]];
0 处的延迟将使其立即发生,必须在通用模式运行循环中完成,以便菜单即使在打开时也会更新。现在只需制作methodExecutedWhenMenuIsClicked
并设置它,以便文本字段响应。
- (void)methodExecutedWhenMenuIsClicked{
[[yourTextfiled window] makeFirstResponder:yourTextField];
您可以使用 将任何视图放入菜单中-[NSMenuItem setView:]
。请参阅 NSMenuItem.h 中的长注释以及Application Menu 和 Pop-up List Programming Topics中的 Menus中的 Views 部分。
你可能会很挣扎。我只是尝试做同样的事情,并阅读Ahruman 引用的 Application Menu 中的 Views in Menus 和 Pop-up List Programming Topics 文档,我发现了这个:
菜单项中的视图可以正常接收所有鼠标事件,但不支持键盘事件。在“非粘性”菜单跟踪期间(即按住鼠标按钮操作菜单),菜单项中的视图接收 mouseDragged: 事件。
我认为我们是 SOL。显然 Spotlight 会弹出一个无边框窗口。