2011-08-02 139 views
2

是否有創建基於單文檔界面(SDI)文檔的可可應用程序的方法? 我不希望用戶一次打開多個文檔。單文檔界面基於可可應用程序的文檔

+0

你爲什麼要這樣做?這是不平凡的,因爲通常不建議僅支持單個打開的文檔。 –

+0

我寫的應用程序是像GarageBand這樣的音樂軟件。一次訪問硬件有限制,所以我不希望用戶一次打開多個歌曲文件。 –

回答

0

您應該能夠通過基於Cocoa應用程序模板創建新的Xcode項目來獲取所需的UI,請確保取消選中「創建基於文檔的應用程序」。

你必須親自編寫Open/Save命令,並從NSDocument和朋友那裏更改你的類,但它應該是可行的。

3

你可以這樣做,它不是太糟糕。

一般方法:使用NSDocument,您必須將其自身附加到單例NSWindowController,它是您的應用程序的xib。當沒有文檔打開時,您甚至可以在該窗口中添加其他內容。這種設計對我的作品很大,因爲我一直在玩所有NSDocument功能,等等

這裏去一些更詳細:


刪除所有其他窗口

您將使用新窗口,因此請刪除由Xcode創建的應用程序模板中可能缺省的任何內容。也許在你的MainMenu.xib中,擺脫這一切,或將它移到你的新xib。

創建你的未來NSWindowController

只要創建一個用於測試的佔位符,以後我們會更多的方式給它添加一個新的廈門國際銀行(窗口)(因爲它是我們的主窗口,用戶總會看到)。

創建自己的NSWindowController,使之成爲單身

所以,你的NSWindowController中,創建一個加載您的廈門國際銀行(僅一次),並返回這個單一單隨時它被稱爲一個單包裝。我用了一個幫手的#define,看看這裏的更多信息:https://gist.github.com/1057420

+ (id) singletonInstance { 
    DEFINE_SHARED_INSTANCE_USING_BLOCK(^{ 
     return [[self alloc] initWithWindowNibName:@"yourxibfilename"]; 
    }); 
} 

修改您NSDocument,使其重視僅此單窗口

添加這樣的事情你NSDocument基於文檔。基本上你會告訴Document使用你擁有的單例窗口,並且應該自動調用NSWindowController內部的setDocument來替換它顯示的任何現有的NSDocument。

- (void)makeWindowControllers { 
    ReceiptDocumentWindowController *wc = [ReceiptDocumentWindowController singletonInstance]; 
    [self addWindowController:wc]; 
} 

考慮在關閉時從NSWindowController中刪除NSDocument,以確保它不會四處移動。在某些情況下,我認爲這不是必需的,但您也可以調查。所以,你也文件NSDocument裏面:

- (void)close { 
    [self removeWindowController:[ReceiptDocumentWindowController singletonInstance]]; 
    [super close]; 
} 

測試 - 你現在應該有一個原型解決方案的工作

將有與它的一些問題,而這些都取決於您的具體要求。

首先,您可以考慮使用您自己的NSDocumentController在打開新文檔之前自動關閉所有打開的文檔。你需要進一步研究這一點。

回到我提到的那個NSViewController,以及如何使用「當前打開的文檔」進行更新。我在NSWindowController中添加了一些粘合劑來設置文檔,以便將打開的任何文檔附加到我的下游IBOutlet連接的xib實例(如此NSViewController)。好吧,是這樣的:

- (void)setDocument:(NSDocument *)lDocument { 
    [super setDocument:lDocument]; 
    if (lDocument != nil && self.receiptDetailViewController != nil) 
     self.receiptDetailViewController.representedObject = lDocument; 
} 

現在,在我的NSDocumentViewController所代表的對象具有使用可可綁定到NSViewController.representedObject綁定意見。所以,賓果,它使我的東西幾乎像魔術一樣。我建議像這樣封裝,這樣你就可以專注於用xib中的視圖來呈現文檔,而NSViewController現在可以引用任何被打開的文檔。

如果這不夠清楚,請告訴我。我會發布更多的代碼。 祝你好運,讓我知道如果這有幫助。

Marcus Williford

+0

謝謝你的建議。我將在稍後嘗試! –

相關問題