如何将选择器绑定到 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
指定要调用它的对象。
在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
指定要调用它的对象。