您的意思大概是您希望编辑菜单中的文本编辑项(如撤消、剪切、复制、粘贴、全选)在您的应用程序窗口中工作。
这些菜单项是另一个应用程序的一部分,并且仅在该应用程序中发送消息。它们对您的应用程序不可用,无论它是否是“代理”(没有自己的可见菜单栏)。如果您的代理应用程序的一个窗口是关键窗口,并且用户单击属于另一个应用程序的菜单标题(如文件或编辑),则该应用程序将激活并且您的应用程序的窗口将“退出”关键窗口状态。
您可以让常用的快捷键(例如用于 Cut 的 ⌘X)适用于您的应用,而且很简单。当您的应用程序的一个窗口是用户的关键窗口时,您的应用程序会接收键盘事件,并且您的NSApplication 对象(自动为您创建)将检查其mainMenu 的键盘快捷键,即使未显示主菜单也是如此在屏幕上。
OS X“Cocoa 应用程序”项目模板在MainMenu.xib(或Main.storyboard)中为您设置了一个主菜单栏,所有菜单项都连接到相应的操作。因此,如果您保留该主菜单栏和“编辑”菜单以及“编辑”菜单中的菜单项,并保留在这些项目上设置的快捷方式,那么即使您在 @987654330 中将 LSUIElement 设置为 YES,键盘快捷方式也将起作用@,当您的应用程序的一个窗口是关键窗口时。换句话说,快捷键默认会起作用,你必须改变一些东西才能让它们停止工作。
应用程序窗口中的文本字段仍将获得默认的右键菜单,其中包含剪切、复制和粘贴等常用项目,因此您也无需执行任何其他操作即可。
这是我的测试应用MainMenu.xib的内容:
我已经单独离开了主菜单栏。我创建了一个包含两个项目的单独菜单,“显示窗口”和“退出”。我已将“退出”的快捷方式设置为 ⌘Q,但此快捷方式无效。主菜单栏外的 StatusItem > Quit 菜单项(在我的屏幕截图中不可见)具有相同的快捷方式设置,这就是重要的设置。我在另一个 Quit 项上设置了快捷方式,因为它对用户可见,而主菜单栏对用户不可见。
我已将此 Quit 项目连接到 First Responder 的 terminate: 操作。 (StatusItem > Quit 菜单项默认连接方式相同。)
这是我的AppDelegate:
@NSApplicationMain
class AppDelegate: NSObject, NSApplicationDelegate {
@IBOutlet var window: NSWindow!
@IBOutlet var statusItemMenu: NSMenu!
var statusItem: NSStatusItem?
func applicationDidFinishLaunching(aNotification: NSNotification) {
self.statusItem = NSStatusBar.systemStatusBar().statusItemWithLength(NSVariableStatusItemLength)
let statusItem = self.statusItem!
let button = statusItem.button!
button.title = "Hello"
statusItem.menu = statusItemMenu
}
@IBAction func showWindow(sender: AnyObject) {
NSApp.activateIgnoringOtherApps(true)
window.makeKeyAndOrderFront(sender)
}
}
我已将“显示窗口”菜单项连接到 showWindow(_:) 操作,并将 statusItemMenu 插座连接到 XIB 中的独立菜单。
我还在Info.plist 中将“Application is Agent (UIElement)”设置为“YES”。
当我运行这个应用程序时,它会在菜单栏中创建状态项。我可以从项目中选择“显示窗口”,我的窗口来到前面并成为关键。我可以右键单击文本字段以获取其上下文菜单。我可以使用标准的快捷键来剪切/复制/粘贴/等等,关闭窗口,甚至退出应用程序。