Swift中的子类NSApplication

iPe*_*era 11 nsapplication swift

我创建了NSApplication子类:

class MyApplication: NSApplication {
    override func sendEvent(theEvent: NSEvent) {
        if theEvent.type == NSEventType.KeyUp && (theEvent.modifierFlags & .CommandKeyMask).rawValue != 0 {
            self.keyWindow?.sendEvent(theEvent)
        } else {
            super.sendEvent(theEvent)
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

之后,我将Info.plist中的"Principal class"更改为MyApplication,最后在Main.storyboard的Application Scene中,我也将Application更改为MyApplication.

当我运行应用程序时,我得到以下消息:

class MyApplication: NSApplication {
    override func sendEvent(theEvent: NSEvent) {
        if theEvent.type == NSEventType.KeyUp && (theEvent.modifierFlags & .CommandKeyMask).rawValue != 0 {
            self.keyWindow?.sendEvent(theEvent)
        } else {
            super.sendEvent(theEvent)
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

有人可以帮我弄这个吗?

rin*_*aro 28

尝试:

@objc(MyApplication)
class MyApplication: NSApplication {
Run Code Online (Sandbox Code Playgroud)

或者,您必须像这样设置Info.plist.

<key>NSPrincipalClass</key>
<string>YourAppName.MyApplication</string>
        ^^^^^^^^^^^^
Run Code Online (Sandbox Code Playgroud)

没有关于此的确切文档,但此描述对应:

为了在Objective-C代码中使用Swift类时保留命名空间,Swift类以其完全限定名称暴露给Objective-C运行时.因此,当您使用对Swift类的字符串表示形式进行操作的API时,必须包含该类的完全限定名称.例如,在创建基于文档的Mac应用程序时,可以在应用程序的Info.plist文件中提供NSDocument子类的名称.在Swift中,您必须使用文档子类的全名,包括从应用程序或框架名称派生的模块名称.

:

@objc(<#name#>)Swift类上使用该属性时,该类在Objective-C中可用,没有任何命名空间.