首页 > 解决方案 > 如何将选择器绑定到 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 时,它会向控制台打印“左键单击!(AppDelegate)”和“右键单击!(AppDelegate)”。

为什么会这样?以及如何让它调用在 StatusItem 类中定义的 statusBarButtonClicked 方法?

标签: swiftmacoscocoa

解决方案


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

 self.item.button?.target = self 

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

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


推荐阅读