Swift3.1 - NSApplication.terminate或NSApplication.shared()。终止

时间:2017-05-22 15:21:59

标签: swift3 xcode8

使用旧样式创建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(("终止:))部分更改为#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()部分

添加了图片 4 ways of terminate an statusBar app using menuItems actions

1 个答案:

答案 0 :(得分:0)

语法为Type.method的选择器会将method发送到Type参数中指定的target实例

我想在macOS中,选择没有指定的目标会被发送到FirstResponder忽略Type。方法terminate:FirstResponder

公开

在代码中,您必须将方法发送到实例,因此需要shared()