【问题标题】:Subclass NSApplication in SwiftSwift 中的子类 NSApplication
【发布时间】:2019-08-23 04:38:00
【问题描述】:

我创建了 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)
        }
    }
}

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

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

找不到类:MyApplication,正在退出

有人可以帮我解决这个问题吗?

【问题讨论】:

    标签: swift nsapplication


    【解决方案1】:

    试试:

    @objc(MyApplication)
    class MyApplication: NSApplication {
    

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

    <key>NSPrincipalClass</key>
    <string>YourAppName.MyApplication</string>
            ^^^^^^^^^^^^
    

    没有关于这个的确切文件,但是this description is corresponding

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

    this:

    当您在 Swift 类上使用 @objc(&lt;#name#&gt;) 属性时,该类在 Objective-C 中可用,无需任何命名空间。

    【讨论】:

    • 我发现我需要 @objc(MyClassName) 行,因此,对于 10.11 SDK,Xcode 7.2 上的 NSPrincipalClass 值必须是 MyClassName。似乎没有其他任何工作。
    • 好吧,如果你能弄清楚命名空间,另一种方法确实只使用名称间距。如果应用名称中有空格,则需要在其中添加下划线。谁知道是不是英文的。
    • 从 Xcode 11.3 开始,我可以确认 $(PRODUCT_NAME).MyClass 适用于 Swift 文件。重要的是不要添加扩展。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多