提问者:小点点

从故事板启动初始应用程序无法调用NSDocument init


我已经使用 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
    }
}

应用程序启动时,没有一个初始化显示调试打印输出。应用程序窗口在启动时成功创建,没有明显的文档关联。

然而,我注意到一些我无法解释的非常奇怪的行为:

    < li >虽然我没有看到init调用,但在应用程序对文档的某个实例启动后,autosavesInPlace会被调用三次 < li >当我使用cmd-N(即文件-

我的NSDocument子类被命名为模拟。异常之处似乎是初始启动中有一些绕过Simulation. init的魔法,但在之后的每个文档窗口创建中都将其称为。

以下是我的问题:

  1. 为什么初始启动不调用Simulation. init()?
  2. 当只有初始的、看似部分构造的窗口时,autosavesInPlace如何找到要调用的模拟实例?

共1个答案

匿名用户

在您的情节提要中,确保您的窗口控制器及其内容视图控制器都取消选中“属性”检查器中的< code >是初始控制器,并且< code >演示设置为< code >多个。

选中Is Initial Controller将导致应用程序在任何NSDocument/NSFocumentController“魔术”发生之前实例化一个窗口控制器演示:应该选择多个以保持一致性,尽管这可能不会产生真正的影响。

此外,请确保您的文档类型在< code>Info.plist中设置正确,尤其是< code>NSDocumentClass键(应包含< code>$(PRODUCT_MODULE_NAME))。模拟)。

我相信您关于autosavesInPlace的问题已经在评论中得到了回答……