2017-05-25 144 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