我已经使用 Xcode 模板编写了一个带有情节提要的 macOS 文档类型应用程序,并且沿着这条线的某个地方,初始应用程序启动和文档之间的关联与预期的模式不同,因此在应用程序首次启动时,我期望的任何 NSDocument 初始值设定项都不会被调用(但此后每个新窗口都会调用)。
我已经对所有四个记录的NSDocument初始化器进行了子类化,如下所示:
public class Simulation: NSDocument {
override init() {
debugPrint("--------------------\(#file)->\(#function) called")
super.init()
}
init(contentsOf: URL, ofType: String) throws {
debugPrint("--------------------\(#file)->\(#function) called")
fatalError()
}
init(for: URL?, withContentsOf: URL, ofType: String) throws {
debugPrint("--------------------\(#file)->\(#function) called")
fatalError()
}
convenience init(type: String) throws {
debugPrint("--------------------\(#file)->\(#function) called, type: \(type)")
self.init()
}
public override class func autosavesInPlace() -> Bool {
debugPrint("--------------------\(#file)->\(#function) called")
return false
}
}
应用程序启动时,没有一个初始化显示调试打印输出。应用程序窗口在启动时成功创建,没有明显的文档关联。
然而,我注意到一些我无法解释的非常奇怪的行为:
我的NSDocument子类被命名为模拟。异常之处似乎是初始启动中有一些绕过Simulation. init的魔法,但在之后的每个文档窗口创建中都将其称为。
以下是我的问题:
在您的情节提要中,确保您的窗口控制器及其内容视图控制器都取消选中“属性”检查器中的< code >是初始控制器,并且< code >演示设置为< code >多个。
选中Is Initial Controller
将导致应用程序在任何NSDocument
/NSFocumentController
“魔术”发生之前实例化一个窗口控制器演示:应该选择多个
以保持一致性,尽管这可能不会产生真正的影响。
此外,请确保您的文档类型在< code>Info.plist中设置正确,尤其是< code>NSDocumentClass键(应包含< code>$(PRODUCT_MODULE_NAME))。模拟)。
我相信您关于autosavesInPlace
的问题已经在评论中得到了回答……