使用较旧的样式创建StatusBarMenuItem,这样就可以了。然而,由于一个警告,我确实想更改我的代码符合Swift 3.1,从
menu.addItem(NSMenuItem(title: "Quit terminate", action: Selector(("terminate:")), keyEquivalent: "q" ))
至
...
menu.addItem(NSMenuItem(title: "Quit quitAction", action: #selector(quitAction), keyEquivalent: "Q"))
...
func quitAction() {
NSApplication.shared().terminate(self) // works of course
// NSApplication.terminate(self) // doesn't works of course but works in a selector
}
然后我发现他们不仅把selector(“terminate:))部分改成了#selector,还把terminate部分改成了
menu.addItem(NSMenuItem(title: "Quit NSAppl.terminate", action: #selector(NSApplication.terminate(_:)), keyEquivalent: "q" ))
但是下面的代码也是有效的(注意'.shared()‘部分)
menu.addItem(NSMenuItem(title: "Quit NSAppl.shared.terminate", action: #selector(NSApplication.shared().terminate(_:)), keyEquivalent: "q" ))
但是,当我想从quitAction函数中删除.shared()部分时,我就会得到一个编译器错误。我的问题是:“为什么我可以使用选择器而不是一行代码来去掉shared()部分?”这样做的理由是什么?谢谢。
实际上,问题应该更像这样:“为什么我可以使用选择器插入shared()部分”?
添加的图片
发布于 2017-05-23 00:19:28
语法为Type.method
的选择器将method
发送到实例,该实例的Type
在target
参数中指定。
我假设在macOS中,没有指定目标的选择器会被发送到FirstResponder
,而忽略Type
。向FirstResponder
公开terminate:
方法
在代码中,您必须将方法发送到实例,因此shared()
是必需的。
https://stackoverflow.com/questions/44116669
复制相似问题