2017-05-25 138 views
1

我已经用故事板编写了一个macOS文档类型的应用程序,使用Xcode模板,并且在该行的最初应用程序启动和文档之间的关联有所不同当应用程序第一次启动时(但之后每调用一个新窗口),都会调用期望的模式,这样我们就不会调用任何我期望的NSDocument初始化程序。从故事板初始应用程序启动失败调用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 
    } 
} 

的inits展览尽管如此debugPrint输出,当应用程序启动。应用程序窗口在启动时成功创建,没有明显的文档关联。

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

  1. 虽然我已经看到了没有初始化的呼叫,autosavesInPlace被称为应用程序对文档的一些实例开始后三次
  2. 当我使用cmd-N(即File-> New,因此newDocument())创建一个新文档时,autosavesInPlace再被调用三次,,然后执行文档init!
  3. 我从来没有看到makeWindowControllers)的调用(

我NSDocument子类被命名为模拟。异常似乎是在初始启动时绕过了Simulation.init,但在之后的每一个文档+窗口创建时都会调用它。

这里是我的问题:

  1. 为什么推出初期不叫Simulation.init()?
  2. autosavesInPlace如何在只有初始的,看似部分构建的窗口时找到仿真实例进行调用?
+0

'autosavesInPlace'是一个类的方法,它被称为的类,而不是一个实例。你有没有实现'applicationShouldOpenUntitledFile'? – Willeke

+0

我错过了'''autosavesInPlace''是一个类函数。不是我的一天,我猜... 无论如何,我还没有实现'''applicationShouldOpenUntitledFile'''。我在应用程序委托中这样做,并在我在那里时为其合作伙伴“applicationOpenUntitledFile”提供了一个存根,并运行该应用程序。这两个人都没有被称为 - 不是当我启动应用程序,而不是为cmd-N。 – Feldur

+0

@Willeke - 具体而言,当我启动应用程序,我看到这个(在VC补充打印)(我无法格式化的代码!) '\t “VC.swift->的init(编码器:一个叫做” \t “VC.swift-> viewDidLoad中()被称为” \t “VC.swift-> viewWillAppear中()被称为” \t “VC.swift-> viewDidAppear()被称为”' 然而,使用CMD-N我得到这个: '\t “Simulation.swift->的init(类型:)调用,类型:Effie.Simulation” \t “Simulation.swift->的init()叫做” \t“Simulation.swif称为 “ \t称为 ” \t “VC.swift-> viewDidLoad中()叫做” \t“ VC.swift-> viewWillAppear中():T-> makeWindowControllers()叫做” \t” VC.swift-> INIT(编码器“VC.swift-> viewDidAppear()调用”' – Feldur

回答

4

在你的故事板,请确保您的窗口控制器及其内容的浏览器都有Is Initial Controller泛滥,Presentation设置为Multiple在属性检查器。

Window Controller Attributes Inspector image

View Controller Attributes Inspector image

Is Initial Controller检查将导致应用程序前,任何NSDocument/NSDocumentController “神奇” 来实例化一个窗口控制器发生。应该选择Presentation: Multiple以保持一致性,尽管它可能没有真正的区别。

此外,请确保您的文档类型正确设置在Info.plist,特别是NSDocumentClass键(应包含$(PRODUCT_MODULE_NAME).Simulation)。

我相信你对autosavesInPlace问题的意见已回答...

+0

就是这样 - 我确实在窗口上设置了“初始控制器”。我从来没有发现 - 我会在黑客中强制viewWillAppear中的文档,这当然导致打开/新的对话框不会出现。我非常感谢帮助。 – Feldur