我已经使用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
}
}
当应用程序启动时,没有任何内容显示debugPrint输出。应用程序窗口在启动时成功创建,没有明显的文档关联。
然而,我注意到一些我无法解释的奇怪行为:
我的NSDocument子类名为Simulation。异常似乎是初始启动中有一些神奇的东西绕过了Simulation.init,但之后调用了每个文档+窗口。
以下是我的问题:
答案 0 :(得分:6)
在故事板中,确保您的Window Controller及其内容视图控制器未选中Is Initial Controller
且Presentation
在属性检查器中设置为Multiple
。
检查Is Initial Controller
将导致应用程序在任何NSDocument
/ NSDocumentController
“魔法”发生之前实例化一个窗口控制器。应该选择Presentation: Multiple
来保持连贯性,尽管它可能没有什么区别。
另外,请确保在Info.plist
中正确设置了文档类型,尤其是NSDocumentClass
密钥(应包含$(PRODUCT_MODULE_NAME).Simulation
)。
我相信您的autosavesInPlace
问题已在评论中得到解答......