Обнаружение событий левого и правого щелчка на NSStatusItem (Swift)

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

var statusItem = NSStatusBar.system().statusItem(withLength: -1)
statusItem.action = #selector(AppDelegate.doSomeAction(sender:))

let leftClick = NSEventMask.leftMouseDown
let rightClick = NSEventMask.rightMouseDown

statusItem.button?.sendAction(on: leftClick)
statusItem.button?.sendAction(on: rightClick)

func doSomeAction(sender: NSStatusItem) {
    print("hello world")
}

Моя функция не вызывается, и я не мог найти почему. Я ценю любую помощь!


person ixany    schedule 17.08.2016    source источник


Ответы (2)


Ты пытался:

button.sendAction(on: [.leftMouseUp, .rightMouseUp])

Затем посмотреть, какая кнопка мыши была нажата в функции doSomeAction()?

Так что это будет выглядеть как-то...

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

func applicationDidFinishLaunching(_ aNotification: Notification) {

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

}

func doSomeAction(sender: NSStatusItem) {

    let event = NSApp.currentEvent!

    if event.type == NSEventType.rightMouseUp {
        // Right button click
    } else {
        // Left button click
    }

}

https://github.com/craigfrancis/datetime/blob/master/xcode/DateTime/AppDelegate.swift

person Craig Francis    schedule 10.03.2017
comment
это действительно работает, но похоже только на .rightMouseUp, а не на .rightMouseDown - person joe; 27.04.2017
comment
Вы также изменили строку button.sendAction? - person Craig Francis; 27.04.2017
comment
дох! изменено в sendAction, а не в заявлении! работает отлично, спасибо х) - person joe; 27.04.2017
comment
Как мне это сделать с помощью NSEventMask.scrollWheel? - person André Kuhlmann; 25.07.2017
comment
Как открыть контекстное меню только при щелчке правой кнопкой мыши по элементу? Я читал, что popUpStatusItemMenu устарел, и я не мог понять, как это сделать в Swift 4... - person stefa.rossi; 21.05.2018
comment
Не забудьте также принять контрольную кнопку: if event.type == .rightMouseUp || (event.modifierFlags.contains(.control) && event.type == .leftMouseUp) - person exp; 08.11.2020

Обновлено: SWIFT 4

Я обновил (Крейг Фрэнсис) ответ

func doSomeAction(sender: NSStatusItem) {

    let event = NSApp.currentEvent!

    if event.type == NSEvent.EventType.rightMouseUp{
        // Right button click
    } else {
        // Left button click
    }
person dbrownjave    schedule 18.02.2018
comment
Можете ли вы добавить немного больше о том, почему этот код работает и что он делает для решения проблемы? - person Daniel; 18.02.2018