Левый или правый щелчок по элементу строки состояния Mac Swift 2

Я пытался разработать простую программу, которая находится в строке состояния Mac. Мне это нужно, чтобы при щелчке левой кнопкой мыши запускалась функция, а при щелчке правой кнопкой мыши отображалось меню с элементами «О программе» и «Выйти».

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

Заранее благодарим за любую помощь!


person Joe Izzard    schedule 21.10.2015    source источник


Ответы (3)


Swift 3

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

if let button = statusItem.button {
    button.action = #selector(self.statusBarButtonClicked(sender:))
    button.sendAction(on: [.leftMouseUp, .rightMouseUp])
}

func statusBarButtonClicked(sender: NSStatusBarButton) {
    let event = NSApp.currentEvent!

    if event.type == NSEventType.rightMouseUp {
        print("Right click")
    } else {
        print("Left click")
    }
}

Swift 4

let statusItem = NSStatusBar.system.statusItem(withLength: NSStatusItem.variableLength)

if let button = statusItem.button {
    button.action = #selector(self.statusBarButtonClicked(_:))
    button.sendAction(on: [.leftMouseUp, .rightMouseUp])
}

func statusBarButtonClicked(sender: NSStatusBarButton) {
    let event = NSApp.currentEvent!

    if event.type == NSEvent.EventType.rightMouseUp {
        print("Right click")
    } else {
        print("Left click")
    }
}

Более длинный пост доступен по адресу https://samoylov.eu/2016/09/14/handling-left-and-right-click-at-nsstatusbar-with-swift-3/

person Michael Samoylov    schedule 14.09.2016
comment
.popUpMenu() устарело с macOS 10.14. - person Ryan; 14.11.2018
comment
Кроме того, имейте в виду, что в официальных документах свойство menu NSStatusItem говорит, что если не равно нулю, поведение элемента состояния при однократном нажатии не используется. Установка значения этого свойства на nil удаляет меню. Это означает, что если ваше меню не равно нулю, action не будет работать. - person Ram Patra; 20.05.2020

для этого вы можете использовать свойство кнопки statusItem.

    let statusItem = NSStatusBar.systemStatusBar().statusItemWithLength(-1)  
    let statusButton = statusItem!.button!
    statusButton?.target = self // or wherever you implement the action method
    statusButton?.action = "statusItemClicked:" // give any name you want
    statusButton?.sendActionOn(Int((NSEventMask.LeftMouseUpMask | NSEventMask.RightMouseUpMask).rawValue)) // what type of action to observe

затем вы реализуете функцию действия, в приведенном выше коде я назвал ее "statusItemClicked"

func statusItemClicked(sender: NSStatusBarButton!){
    var event:NSEvent! = NSApp.currentEvent!
    if (event.type == NSEventType.RightMouseUp) {
        statusItem?.menu = myMenu //set the menu
        statusItem?.popUpStatusItemMenu(myMenu)// show the menu 
    }
    else{
        // call your function here
    }
}
person Nasim Saleh    schedule 20.12.2015
comment
В Swift 2 использование оператора | для NSEventMask операндов дает ошибку. - person beeb; 06.03.2016
comment
statusButton? .sendActionOn (Int (NSEventMask.RightMouseUpMask.rawValue | NSEventMask.LeftMouseUpMask.rawValue)) работает со Swift 2 - person Hampus; 06.06.2016

В Swift 5

Я так работал. Я смог определить, был ли это щелчок правой кнопкой мыши или щелчок левой кнопкой мыши, ссылаясь на приведенный выше ответ.

Однако, щелкнув правой кнопкой мыши, вы сможете постоянно отображать только NSMenu.

Затем я добавляю statusItem.button?.performClick(nil) & statusItem?.menu = nil

Вы можете добавить statusItem?.popUpMenu(menu), но в macOS 10.14 он обесценился. (Но это сработало.)

Наконец, если щелкнуть левой кнопкой мыши, запускается функция. И если щелкнуть правой кнопкой мыши, он запускает такие пункты меню, как «Выйти».

Спасибо тем, кто ответил ранее!

class AppDelegate: NSObject, NSApplicationDelegate {
  func applicationDidFinishedLaunching(_ notification: Notification) {
    // .....
    // .....

    if let button = statusItem?.button {
        button.image = NSImage(named: "iconImage")
        button.action = #selector(self.statusBarButtonClicked(_:))
        button.sendAction(on: [.leftMouseUp, .rightMouseUp])
    }
    // Add Menu Item for NSMenu
    menu.addItem(NSMenuItem(title: "Quit", action: #selector(NSApplication.terminate(_:)), keyEquivalent: "q"))
  }
  @objc func statusBarButtonClicked(_ sender: NSStatusBarButton) {
    let event = NSApp.currentEvent!
    if event.type == NSEvent.EventType.rightMouseUp {
      print("Right Click")
      statusItem?.menu = menu
      statusItem?.button?.performClick(nil)
      // statusItem?.popUpMenu(menu)
      statusItem?.menu = nil
    } else {
      print("Left Click")
      togglePopover(sender)
    }
  }
}
person Ryosuke Kamimura    schedule 25.06.2021