Swift 通过选择器向其他类发送消息
我正在构建一个MacOS应用程序,它有一个NSMenu 问题是,我试图将Swift 通过选择器向其他类发送消息,swift,macos,cocoa,selector,Swift,Macos,Cocoa,Selector,我正在构建一个MacOS应用程序,它有一个NSMenu 问题是,我试图将操作消息发送到菜单中的类函数,但我无法指定目标。下面的#选择器(MenuEventHandler.sayHi)不起作用。菜单项将变灰 menu.addItem(NSMenuItem(title: "Option0", action: #selector(MenuEventHandler.sayHi), keyEquivalent: "n")) 然而,奇怪的是,类似的语法适用于quit menu.addItem(NSMe
操作
消息发送到菜单中的类函数,但我无法指定目标。下面的#选择器(MenuEventHandler.sayHi)
不起作用。菜单项将变灰
menu.addItem(NSMenuItem(title: "Option0", action: #selector(MenuEventHandler.sayHi), keyEquivalent: "n"))
然而,奇怪的是,类似的语法适用于quit
menu.addItem(NSMenuItem(title: "Quit", action: #selector(NSApplication.terminate(_:)), keyEquivalent: "q"))
通过选择器将消息发送到其他类的正确语法是什么?
提前感谢该类必须是NSObject
的子类,并且必须位于响应者链中。为什么您不能指定目标?请向停靠我答案的人解释两点原因。这是一个很好的解决方案,解决了这个问题。
import Cocoa
class MenuEventHandler {
@objc func sayHi(){
NSSound.beep()
print("Hi")
}
}
let menuEventHandler = MenuEventHandler()
class AppDelegate: NSObject, NSApplicationDelegate {
var window:NSWindow!
func buildMenu() {
let mainMenu = NSMenu()
NSApp.mainMenu = mainMenu
// **** App menu **** //
let appMenuItem = NSMenuItem()
mainMenu.addItem(appMenuItem)
let appMenu = NSMenu()
appMenuItem.submenu = appMenu
let optionMenuItem = NSMenuItem(title: "Option0", action: nil, keyEquivalent: "n")
optionMenuItem.target = menuEventHandler
optionMenuItem.action = #selector(menuEventHandler.sayHi)
appMenu.addItem(optionMenuItem)
appMenu.addItem(.separator())
appMenu.addItem(withTitle: "Quit", action:#selector(NSApplication.terminate), keyEquivalent: "q")
}
func buildWnd() {
let _wndW : CGFloat = 400
let _wndH : CGFloat = 300
window = NSWindow(contentRect:NSMakeRect(0,0,_wndW,_wndH),styleMask:[.titled, .closable, .miniaturizable, .resizable], backing:.buffered, defer:false)
window.center()
window.title = "Swift Test Window"
window.makeKeyAndOrderFront(window)
}
func applicationDidFinishLaunching(_ notification: Notification) {
buildMenu()
buildWnd()
}
func applicationShouldTerminateAfterLastWindowClosed(_ sender: NSApplication) -> Bool {
return true
}
}
let appDelegate = AppDelegate()
// **** Main **** //
let application = NSApplication.shared
application.delegate = appDelegate
application.setActivationPolicy(.regular)
application.activate(ignoringOtherApps:true)
application.run()
import Cocoa
class MenuEventHandler {
@objc func sayHi(){
NSSound.beep()
print("Hi")
}
}
let menuEventHandler = MenuEventHandler()
class AppDelegate: NSObject, NSApplicationDelegate {
var window:NSWindow!
func buildMenu() {
let mainMenu = NSMenu()
NSApp.mainMenu = mainMenu
// **** App menu **** //
let appMenuItem = NSMenuItem()
mainMenu.addItem(appMenuItem)
let appMenu = NSMenu()
appMenuItem.submenu = appMenu
let optionMenuItem = NSMenuItem(title: "Option0", action: nil, keyEquivalent: "n")
optionMenuItem.target = menuEventHandler
optionMenuItem.action = #selector(menuEventHandler.sayHi)
appMenu.addItem(optionMenuItem)
appMenu.addItem(.separator())
appMenu.addItem(withTitle: "Quit", action:#selector(NSApplication.terminate), keyEquivalent: "q")
}
func buildWnd() {
let _wndW : CGFloat = 400
let _wndH : CGFloat = 300
window = NSWindow(contentRect:NSMakeRect(0,0,_wndW,_wndH),styleMask:[.titled, .closable, .miniaturizable, .resizable], backing:.buffered, defer:false)
window.center()
window.title = "Swift Test Window"
window.makeKeyAndOrderFront(window)
}
func applicationDidFinishLaunching(_ notification: Notification) {
buildMenu()
buildWnd()
}
func applicationShouldTerminateAfterLastWindowClosed(_ sender: NSApplication) -> Bool {
return true
}
}
let appDelegate = AppDelegate()
// **** Main **** //
let application = NSApplication.shared
application.delegate = appDelegate
application.setActivationPolicy(.regular)
application.activate(ignoringOtherApps:true)
application.run()