Добавление дополнительной строки меню в macOS

Я пытаюсь создать приложение, которое будет отображать дополнительную строку меню в macOS.

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

Фрагменты кода примерно такие:

@NSApplicationMain
class AppDelegate: NSObject, NSApplicationDelegate {
    var statusBarItem: NSStatusItem!

    func applicationDidFinishLaunching(_ aNotification: Notification) {
        let statusBar = NSStatusBar.system
        statusBarItem = statusBar.statusItem(
            withLength: NSStatusItem.squareLength)
        statusBarItem.button?.title = "????"

        let statusBarMenu = NSMenu(title: "Cap Status Bar Menu")
        statusBarItem.menu = statusBarMenu

        statusBarMenu.addItem(
            withTitle: "Order a burrito",
            action: #selector(AppDelegate.orderABurrito),
            keyEquivalent: "")

        statusBarMenu.addItem(
            withTitle: "Cancel burrito order",
            action: #selector(AppDelegate.cancelBurritoOrder),
            keyEquivalent: "")
    }

    @objc func orderABurrito() {
        print("Ordering a burrito!")
    }

    @objc func cancelBurritoOrder() {
        print("Canceling your order :(")
    }

В меню ничего не отображается. Есть ли что-то, что мне нужно включить, чтобы оно отображало меню? Пробовал и с картинками, тоже не получилось.


person francisaugusto    schedule 19.10.2019    source источник
comment
В документации для statusItemWithLength: сказано: Получатель не сохраняет ссылку на элемент статуса, поэтому вам нужно сохранить его. В противном случае объект удаляется из строки состояния при освобождении. Возможно, вам следует попытаться сохранить сильную ссылку на ваш statusBarItem?   -  person TheNextman    schedule 20.10.2019
comment
Спасибо @TheNextMan. Это то, что я делаю с var statusBarItem: NSStatusItem!, но, может быть, это должно быть вне класса?   -  person francisaugusto    schedule 25.10.2019
comment
Я никогда раньше не писал быстрый код, но похоже, что ваша переменная statusBarItem выходит из области видимости в конце applicationDidFinishLaunching и поэтому будет освобождена. Вам нужно сохранить ссылку на уровне класса (член класса или свойство).   -  person TheNextman    schedule 25.10.2019


Ответы (1)


Забавный. Я сделал тот же учебник, и у меня не было никаких проблем.

https://8thlight.com/blog/casey-brant/2019/05/21/macos-menu-bar-extras.html

Вот что в моем коде.

--

// at the top
import Cocoa
import SwiftUI

// first lines of the class AppDelegate

var window: NSWindow!  // I don't think this is important

var statusBarItem: NSStatusItem!

// top lines of applicationDidFinishLaunching

// Create the SwiftUI view that provides the window contents.
let contentView = ContentView()

// Menu Bar Extras
let statusBar = NSStatusBar.system

statusBarItem = statusBar.statusItem(withLength: NSStatusItem.squareLength)

statusBarItem.button?.title =  "????"

let statusBarMenu = NSMenu(title: "Cap Status Bar Menu")

statusBarMenu.addItem(
    withTitle: "Order a burrito",
    action: #selector(AppDelegate.orderABurrito),
    keyEquivalent: ""
)

statusBarMenu.addItem(
    withTitle: "Cancel burrito order",
    action: #selector(AppDelegate.cancelBurritoOrder),
    keyEquivalent: ""
)

statusBarItem.menu = statusBarMenu

// the rest is window creation code

// more methods of the AppDelegate
// make sure this part of the code is correct to be
// "superstitious"; maybe Xcode does not behave properly
// with the @objc keywords/modifiers/decorators
@objc func orderABurrito() {
    print("Ordering a burrito!")
}

@objc func cancelBurritoOrder() {
    print("Cancelling order...")
}

В противном случае, я бы предложил повторить урок еще раз, если вы не увидели что-то в первый раз. Удачи и счастливого кодирования.

person Tarek S Nassar    schedule 06.04.2020