Отправка сообщения другому классу через селектор - PullRequest
0 голосов
/ 03 апреля 2020

Я создаю приложение MacOS с NSMenu.

Проблема в том, что я пытаюсь отправить сообщение action функции класса в MenuEventHandler, пока нет target I могу уточнить. И следующее #selector(MenuEventHandler.sayHi) не работает. Пункт меню будет серым.

menu.addItem(NSMenuItem(title: "Option0", action: #selector(MenuEventHandler.sayHi), keyEquivalent: "n"))


class MenuEventHandler {

    @objc static func sayHi(){
        print("Hi")
    }
}

Однако странно то, что подобный синтаксис работает для quit.

menu.addItem(NSMenuItem(title: "Quit", action: #selector(NSApplication.terminate(_:)), keyEquivalent: "q"))

Какой правильный синтаксис для отправки сообщение другому классу через selector?
Заранее спасибо?

1 Ответ

0 голосов
/ 08 апреля 2020
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()

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...