Программное создание меню с помощью Swift 3 и Cocoa

Я пытаюсь создать приложение Cocoa GUI программно (т. е. без файла nib) с помощью Swift 3. У меня возникли проблемы с отображением меню приложения.

Я ожидал бы, что приведенный ниже код покажет пункты меню файла в строке меню. Вместо этого, в то время как окно запускается и работает, как ожидалось, код для установки меню, похоже, не имеет никакого эффекта:

import AppKit

final class ApplicationController: NSObject, NSApplicationDelegate {
    var mainWindow: NSWindow?

    func applicationDidFinishLaunching(_ aNotification: Notification) {
        let mainMenu = NSMenu()
        let mainMenuFileItem = NSMenuItem(title: "File", action: nil, keyEquivalent: "")
        let fileMenu = NSMenu(title: "File")
        fileMenu.addItem(withTitle: "New...", action: nil, keyEquivalent: "n")
        mainMenuFileItem.submenu = fileMenu

        mainMenu.addItem(mainMenuFileItem)

        NSApp.mainMenu = mainMenu

        let window = NSWindow(contentRect: NSRect(x: 0, y: 0, width: 800, height: 600),
                                            styleMask: [.titled, .closable, .resizable, .miniaturizable],
                                            backing: NSBackingStoreType.buffered, defer: false)
        window.orderFrontRegardless()
        window.title = "Hello World"
        self.mainWindow = window

        NSApp.activate(ignoringOtherApps: true)

    }

    func applicationWillTerminate(_ aNotification: Notification) {
        print("terminating")
    }

    func applicationShouldTerminateAfterLastWindowClosed(_ app: NSApplication) -> Bool{
        return true
    }
}

let app = NSApplication.shared()
let controller = ApplicationController()
app.delegate = controller

app.run()

ближе всего я нашел к рабочему примеру ответ. Однако кажется, для более ранней версии Swift / Cocoa, и я не могу заставить этот пример работать.

что я делаю не так?

1 ответов


нужно позвонить NSApp.setActivationPolicy(.regular) чтобы сделать приложение "обычным". Звонить до приложения.run () исправляет проблему отсутствия отображения меню.

таким образом," основная " часть кода должна быть:

let app = NSApplication.shared()
NSApp.setActivationPolicy(.regular)
let controller = ApplicationController()
app.delegate = controller

app.run()