2011-12-01 38 views
4

我正在構建我的第一個嚴重的可可應用程序。這是一個基於文檔的應用程序,使用核心數據進行永久存儲使用Xcode的「新建項目」模板選項,我的項目開始與一對夫婦的默認類:NSDocumentController如何插入我的基於文檔的應用程序?

  • MainMenu.xib(我的應用程序的主菜單)
  • EventDocument.xib(我的應用程序的主窗口)
  • EventDocument.h和EventDocument.m(持久性文檔類)

我把設計從那裏,這一切工作,而好聽,但是通過another question我碰到一個可可類NSDocumentController我是不是來了意識到。該類顯然提供了用於管理基於文檔的應用程序中的文檔類的默認邏輯。

我的問題是這個類如何插入我的應用程序 - 如果有的話 - 我需要它嗎?此時,我使用EventDocument類作爲一種頂級控制器。它從菜單中選擇用戶選項(帶有選項和iTunes的樹視圖),調出處理這些選項的不同視圖/控制器,並傳遞管理對象上下文。如果NSDocumentController是「要走的路」,爲什麼Apple不會將其作爲項目模板的一部分生成?

+0

你能提供一個鏈接到另一個問題,並解釋爲什麼你認爲你需要NSDocumentController? – 2011-12-01 08:18:03

+0

這並不是說我認爲我需要它,因爲當前的設計非常棒。我只是想知道我是否錯過了Cocoa應用程序常見的設計模式。 – Roger

+0

我添加了問題的鏈接... – Roger

回答

8

我相信你誤解了NSDocumentController的目標,可能是因爲它的名字與NSWindowController和NSViewController類似。

在Cocoa MVC中,控制器調解視圖和模型。在處理窗口時,控制器通常是NSWindowController的子類,在視圖的情況下,它是NSViewController的子類。

在基於文檔的體系結構中,NSDocument類是表示文檔的模型與相應的視圖和控制器之間的中介。實質上,它負責基於外部表示重新創建模型,並提供一些附加與模型和視圖對應的控制器行爲的方式。兩種設計通常用於該:

  • 的NSDocument亞類有效地用作窗口(潛在地查看以及)控制器 - 例如,通過實施IBActions。這應該適用於簡單的應用程序,但它可能很快導致膨脹的NSDocument子類處理超過它應該。 documentation說:

    默認的基於文檔的應用程序項目模板不屬於NSWindowController。如果您正在編寫簡單的應用程序,則不需要繼承NSWindowController。但是,如果您正在編寫具有更高級要求的應用程序,則幾乎肯定會這樣做。

  • NSDocument子類創建自定義窗口控制器,它依次實現控制器行爲,也可能使用視圖控制器。

在很多(?大多數)情況下,有沒有必要的NSDocumentController子類 - 你的應用程序的控制器部分將窗控制器,視圖控制器,或者您NSDocument子類中。也就是說,在某些情況下,可能需要解釋documentation

通常,您不應該需要子類NSDocumentController。幾乎所有可以通過子類化完成的事情都可以通過應用程序的委託來輕鬆完成。但是,如果需要,可以繼承NSDocumentController。

例如,如果您需要自定義「打開」面板,則顯然需要NSDocumentController子類。您可以重寫NSDocumentController方法runModalOpenPanel:forTypes:自定義面板或添加附件視圖。 addDocument:和removeDocument:方法提供給想要知道何時打開或關閉文檔的子類。

+2

更重要的是,NSDocument擁有至少一個窗口控制器和一些視圖控制器,而NSDocumentController *擁有文檔*。在所有權層次結構中,文檔控制者是文檔的父項,不在其子項中。 (另請參閱:僅有一個文檔控制器的事實,而可以有任何數量的未處理文檔。) –

相關問題