NSA应用菜单栏在无可的可可应用程序中没有按预期响应



我有以下单个代码文件,在其中我尝试在不使用nibs或Xcode的情况下,以尽可能少的代码创建一个具有基本功能的Cocoa应用程序。我的大部分信息来自以下博客文章,其中发布了等效的Objective-C代码:(http://www.cocoawithlove.com/2010/09/minimalist-cocoa-programming.html)。我所做的唯一主要更改是用于管理窗口的 AppDelegate 类,这通常是在 Xcode 项目中完成的。

import Cocoa
class AppDelegate: NSObject, NSApplicationDelegate {
    var window: NSWindow
    override init() {
        self.window = NSWindow()
        self.window.setFrame(NSRect(x: 0, y: 0, width: 1280, height: 720), display: true)
        self.window.collectionBehavior = .FullScreenPrimary
        self.window.styleMask = NSTitledWindowMask | NSClosableWindowMask | NSMiniaturizableWindowMask
        self.window.title = "Main Window"
    }
    func applicationDidFinishLaunching(notification: NSNotification) {
        window.makeKeyAndOrderFront(self)
    }
    func applicationShouldTerminateAfterLastWindowClosed(sender: NSApplication) -> Bool {
        return true
    }
}
autoreleasepool {
    NSApplication.sharedApplication()
    NSApp.setActivationPolicy(.Regular)
    let delegate = AppDelegate()
    NSApp.delegate = delegate
    let mainMenu = NSMenu()
    NSApp.mainMenu = mainMenu
    let applicationMenuItem = NSMenuItem()
    mainMenu.addItem(applicationMenuItem)
    let applicationMenu = NSMenu()
    let quitMenuItem = NSMenuItem()
    quitMenuItem.action = #selector(NSApp.terminate(_:))
    quitMenuItem.keyEquivalent = "q"
    quitMenuItem.title = "Quit Cocoa Window Test"
    applicationMenu.addItem(quitMenuItem)
    applicationMenuItem.submenu = applicationMenu
    NSApp.activateIgnoringOtherApps(true)
    NSApp.run()
}

我使用以下命令从终端成功编译:

swiftc -o bin/CocoaWindowTest -g -framework Cocoa ./src/main.swift

菜单上出现了我的问题。尽管 ⌘Q 键盘快捷键按预期工作,但我创建的应用程序菜单无法打开,并且我无法弄清楚原因。

通过在调用

NSApp.run()后调用NSApp.activateIgnoringOtherApps()来解决问题。总而言之,我的代码的主要部分现在如下所示:

autoreleasepool {
    NSApplication.sharedApplication()
    NSApp.setActivationPolicy(.Regular)
    let delegate = AppDelegate()
    NSApp.delegate = delegate
    // Menu setup here...
    NSApp.run()
    NSApp.activateIgnoringOtherApps(true)
}

您应该使用 mainMenu.setSubmenu(applicationMenu, forItem:applicationMenuItem) 来设置子菜单。带有子菜单的项目有一个特殊操作,submenuAction(_:) 分配,负责实际显示子菜单。上述方法正确分配了该操作(并且比自己设置更可取)。

对于它的价值,在菜单完成之前,我不会设置NSApp.mainMenu

最新更新