xcode 在NSStatusItem上单击鼠标左键和右键时出现处理问题

2g32fytz  于 2023-01-27  发布在  其他
关注(0)|答案(2)|浏览(152)

我正在开发我的第一个swift应用程序,我正在创建一个菜单栏按钮。左键单击将执行一个特定的操作,右键单击将下拉一个菜单。现在的情况是,我的左键单击最初是有效的。我的右键单击不会在第一次单击时弹出菜单,但在第二次单击时会。如果我没有选择操作,并单击任何其他地方,使菜单消失,我最终陷入了一个奇怪的循环。左键和右键都会使菜单出现。
我不明白代码卡在哪里了。我在网上找到的所有东西都是旧代码。

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

func applicationDidFinishLaunching(_ aNotification: Notification) {
    // Create the SwiftUI view that provides the window contents.

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

}

@objc func doSomething(sender: NSStatusItem) {

    let event = NSApp.currentEvent!

    if event.type == NSEvent.EventType.rightMouseUp {
        // Right button click
        let statusBarMenu = NSMenu()
        let item1 = NSMenuItem(title:"Quit", action:#selector(self.applicationQuit),keyEquivalent: "")
        item1.target = self

        statusBarMenu.addItem(item1)

        statusItem.menu = statusBarMenu

    } else {
        // Left button click
        print("hello world")

        }

    }

}
xqk2d5yq

xqk2d5yq1#

感谢Willeke,我们找到了答案。代码应该是:

if event.type == NSEvent.EventType.rightMouseUp {
        // Right button click
        let statusBarMenu = NSMenu()
        let item1 = NSMenuItem(title:"Quit", action:#selector(self.applicationQuit),keyEquivalent: "")
        item1.target = self

        statusBarMenu.addItem(item1)

        statusItem.menu = statusBarMenu
        statusItem.button?.performClick(nil)
        statusItem.menu = nil
    }

参考:What is alternative to NSStatusItem.popUpMenu?

8tntrjer

8tntrjer2#

class AppDelegate: NSObject, NSApplicationDelegate {
    private var menuBarIcon: NSStatusItem!

    func applicationDidFinishLaunching(_ aNotification: Notification) {
        createMenuBarIcon()
    }
}

// Dock Icon
extension AppDelegate {
    func createMenuBarIcon() {
        self.menuBarIcon = NSStatusBar.system.statusItem(withLength: NSStatusItem.variableLength)
        
        self.menuBarIcon?.button?.toolTip = "FileBo"
        
        self.menuBarIcon?.button?.action = #selector(menuBarIconClicksAction(_:))
        self.menuBarIcon?.button?.sendAction(on: [.leftMouseUp, .rightMouseUp])
        self.menuBarIcon?.button?.target = self
        
        let icon = NSImage(named: "MenuBarAppIcon")
        icon?.size = .init(width: 20, height: 20)
        
        self.menuBarIcon?.button?.image = icon
    }
    
    func destroyMenuBarIcon() {
        self.menuBarIcon = nil
    }
}

// Dock Menu
extension AppDelegate {
    @IBAction func menuBarIconClicksAction(_ sender: AnyObject) {
        guard let event = NSApp.currentEvent else { return }
        
        if event.type == NSEvent.EventType.rightMouseUp {
            menuBarIcon.menu = dockContextMenu(NSApplication.shared)
            menuBarIcon.button?.performClick(nil)
            menuBarIcon.menu = nil
        } else {
            toggleMainWnd()
        }
    }
    
    func dockContextMenu(_ sender: NSApplication) -> NSMenu {
        let dockMenu = NSMenu()
        
        dockMenu.addItem( NSMenuItem(title: String(localized: "Show/Hide FileBo"), action: #selector(ToggleWndFileBo(_:)), keyEquivalent: "") )
        dockMenu.addItem( NSMenuItem(title: String(localized: "Quit FileBo") , action: #selector(QuitFileBo(_:)), keyEquivalent: "") )
        
        return dockMenu
    }
    
    @IBAction func QuitFileBo(_ sender: AnyObject) {
        NSApplication.shared.terminate(nil);
    }
    
    @IBAction func ToggleWndFileBo(_ sender: AnyObject) {
        toggleMainWnd()
    }
}

相关问题