如何将选择器绑定到 NSObject 中的方法

How to bind selector to method inside NSObject

在macOS swiftui项目中我有如下代码

import Cocoa
import SwiftUI

@NSApplicationMain
class AppDelegate: NSObject, NSApplicationDelegate {

    var window: NSWindow!
    var statusItem: StatusItem = StatusItem()

    func applicationDidFinishLaunching(_ aNotification: Notification) {
    }

    @objc public func statusBarButtonClicked(sender: NSStatusBarButton) {
        let event = NSApp.currentEvent!
        if event.type ==  NSEvent.EventType.rightMouseUp {
            print("Right click! (AppDelegate)")
        } else {
            print("Left click! (AppDelegate)")
        }
    }

    func applicationWillTerminate(_ aNotification: Notification) {
        // Insert code here to tear down your application
    }
}
import Cocoa

class StatusItem : NSObject {
    private let item = NSStatusBar.system.statusItem(withLength: NSStatusItem.squareLength)

    override init() {
        super.init()
        self.item.button?.title = "title"
        self.item.button?.action = #selector(self.statusBarButtonClicked(sender:))
        self.item.button?.sendAction(on: [.leftMouseUp, .rightMouseUp])
    }

    @objc public func statusBarButtonClicked(sender: NSStatusBarButton) {
        let event = NSApp.currentEvent!
        if event.type ==  NSEvent.EventType.rightMouseUp {
            print("Right click! (NSObject)")
        } else {
            print("Left click! (NSObject)")
        }
    }
}

但是当我点击 NSStatusBarButton 时,它会打印 "Left click! (AppDelegate)" 和 "Right click! (AppDelegate)" 到控制台。

为什么会这样?以及如何让它调用 StatusItem class?

中定义的 statusBarButtonClicked 方法

设置按钮的 action 只是您需要做的事情的一半。您还需要指定一个 target。添加

 self.item.button?.target = self 

我相信你会得到你想要的结果。

发生的事情是 action 指定要调用的选择器,target 指定要调用它的对象。