Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift 通过选择器向其他类发送消息_Swift_Macos_Cocoa_Selector - Fatal编程技术网

Swift 通过选择器向其他类发送消息

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

我正在构建一个MacOS应用程序,它有一个NSMenu

问题是,我试图将
操作
消息发送到
菜单中的类函数,但我无法指定
目标。下面的
#选择器(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()