为什么直接调用NSApplication.shared无法实例化Info.plist中Principal Class指定的类?

问题描述 投票:0回答:1

我想使用

NSApplication
的自定义子类来创建
NSApplication.shared
返回的应用程序实例。

class Application: NSApplication {
    // My own methods
}

我将

Principal class
中的
Info.plist
NSApplication
设置为
Application
,也按照
答案
的建议设置为
$(PRODUCT_MODULE_NAME).Application。这有效,我的子类在正常的应用程序模板中正确实例化,除了我的子类的定义和更改
Principal class
之外没有任何修改。这可以使用
print(NSApp as? Application)
进行验证,结果不是
nil


但是,如果我删除

.xib
/
.storyboard
文件,请将
AppDelegate.swift
替换为仅包含以下内容的
main.swift

import Cocoa
class Application: NSApplication, NSApplicationDelegate {
    func applicationShouldTerminateAfterLastWindowClosed(_ _: NSApplication) -> Bool {
        return true
    }
}
NSApplication.shared.delegate = (NSApp as! Application)
NSApp.run()

然后

as!
向下转换将失败,这意味着由
NSApplication.shared
实例化的应用程序对象不是我的自定义类 即使我将主体类设置为之前工作的相同字符串,但现在似乎完全被忽略了。

我怀疑带有

@NSApplicationMain
注释的委托并加载
.xib
文件的正常/默认进程以某种方式注册
Principal class
用于实例化
shared
应用程序实例,但以我的方式直接使用
NSApplication.shared
指定跳过。

在这种特殊情况下,如何为我的应用程序对象使用自定义类?

swift macos cocoa appkit nsapplication
1个回答
3
投票

您需要确保

Principal class
包含正确的模块名称才能加载。

这很好用:

@main
class AppDelegate: NSObject, NSApplicationDelegate {
    func applicationDidFinishLaunching(_ aNotification: Notification) {
        print("NSApp:", NSApplication.shared as! MyApplication)
    }
}

class MyApplication: NSApplication {
    
}

哪个打印:

NS应用程序:

© www.soinside.com 2019 - 2024. All rights reserved.