【问题标题】:MacOS statusbar app show menu and run function on click with swift 3MacOS状态栏应用程序显示菜单并使用swift 3单击运行功能
【发布时间】:2017-02-18 09:28:08
【问题描述】:

我正在使用 Swift 3 制作一个小型菜单栏应用,我希望应用在单击图标时重新加载一些数据,但我也希望它显示 statusMenu?

下面是我的代码示例:

//  AppDelegate.swift

import Cocoa

@NSApplicationMain
class AppDelegate: NSObject, NSApplicationDelegate {

    @IBOutlet weak var statusMenu: NSMenu!

    @IBAction func quitClicked(_ sender: NSMenuItem) {
        NSApplication.shared().terminate(self)
    }

    let statusItem = NSStatusBar.system().statusItem(withLength: NSVariableStatusItemLength)

    func applicationDidFinishLaunching(_ aNotification: Notification) {
        if let button = statusItem.button {
            button.title = "App"
            button.action = #selector(AppDelegate.doSomething(sender:))
            statusItem.menu = statusMenu
        }
    }

    func applicationWillTerminate(_ aNotification: Notification) {
    }

    func doSomething(sender: AnyObject?) {
        NSLog("do something")
    }


}

如果我注释掉

// statusItem.menu = statusMenu 

doSomething() 函数将运行,但我不知道如何同时显示菜单和运行 doSomething 函数,我该怎么做?

【问题讨论】:

  • 我刚刚发现,如果一个函数正在运行并且单击状态栏应用程序图标,为了避免状态栏应用程序崩溃,将这些行添加到每个函数是有帮助的:statusItem.isEnabled = false (在开始时)和 statusItem.isEnabled = true(在函数结束时)。

标签: swift cocoa nsmenu nsstatusbar


【解决方案1】:

将菜单的委托设置为应用程序委托(或其他对象)并实现NSMenuDelegate 协议的optional func menuWillOpen(_ menu: NSMenu)

【讨论】:

  • 太棒了,谢谢,这正是我想要的。
  • @Willeke,你能解释的更准确点吗?
  • NSStatusItemmenu 属性的文档说“当非 nil 时,不使用状态项的单击操作行为。”。
猜你喜欢
  • 1970-01-01
  • 2019-03-21
  • 1970-01-01
  • 2017-05-15
  • 2016-10-17
  • 1970-01-01
  • 2015-11-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多