【问题标题】:#selector doesn't see my own created method in NSMenuItem#selector 在 NSMenuItem 中看不到我自己创建的方法
【发布时间】:2018-03-02 15:48:30
【问题描述】:

我在创建 NSMenuItem 操作时遇到问题,我创建了为我创建菜单的函数,同时在 NSMenuItem 上使用带有选择器的 init 时,如果我使用 @,我描述的函数在 swift 4 上不起作用987654323@ - NSMenuItem 看到选择器正常工作()...这是代码:

mainMenuController: NSObject {
  func setUpMenus(){
  //...
  let firstItemMainMenu = NSMenuItem.init(title: "Test", action: #selector(test), keyEquivalent: "") // This one doesn't work
  let fourthItemMainMenu = NSMenuItem.init(title: "Quit", action: #selector(NSApp.terminate), keyEquivalent: "q") //This one NSApp.terminate - works
  //...
}

这里是函数:

@objc func test(_ sender: Any?){
    let alert = NSAlert()
    alert.addButton(withTitle: "test")
    alert.messageText = "test"
    alert.runModal()
  }
}

有什么想法吗?

【问题讨论】:

  • test 方法在哪里定义?在哪个班?
  • 您还需要设置菜单项的target 属性,以便Cocoa 知道将选择器分派到哪里。
  • 它与 setUpMenus() 在同一类中定义 设置目标没有任何帮助:/
  • 要明确...在您发布的代码中 fourthItemMainMenu 有效,但 firstItemMainMenu 无效?
  • 是的。如果我将 NSApp.terminate 移动到 firstItem 选择器,则 firstItem 有效,而第四个无效,与方法有关,我不知道为什么,但选择器无法识别它

标签: swift macos swift4


【解决方案1】:

两个建议:

  1. 使用语法Selector("terminate:"),将选择器交给First Responder(您将收到使用#selector语法的警告)
  2. 创建一个额外的方法@objc func quit,它调用NSApp.terminate

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多