使用旧样式创建StatusBarMenuItem,效果很好。但是由于警告,我确实想要从
更改我的代码符合Swift 3.1menu.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(("终止:))部分更改为#selector,而将终止部分更改为
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()部分答案 0 :(得分:0)
语法为Type.method
的选择器会将method
发送到Type
参数中指定的target
的实例。
我想在macOS中,选择没有指定的目标会被发送到FirstResponder
忽略Type
。方法terminate:
向FirstResponder
在代码中,您必须将方法发送到实例,因此需要shared()
。