2011-04-14 90 views
8

如果這個論點已經被覆蓋了,我會感到抱歉,但經過一些研究後,我發現沒有什麼精確的。NSDocument保存完整的文件夾?

我需要製作一個基於文檔的應用程序,其中文檔實際上不是單個文件,而是文件的結構化集合。窗口將顯示包含在文件夾中的pdf,並具有特定的文件名,並使用文件夾中其他文件的信息來豐富它。 我不能使用pdf註釋來實現這一點,我真的需要保持與pdf分開的文件。

實現此目標的最佳方法是什麼?我找到的所有示例代碼都使用單個文件。

回答

12

可以使用NSFileWrapper作爲基於文檔的應用程序中的軟件包目錄。

在您的應用程序Info.plist文件中,指出您的文檔類型是包或捆綁包(密鑰LSTypeIsPackage,值爲YES)。

在您的NSDocument子類中,實現以下讀寫方法。在這個例子中,我假設相應的模型實例變量是pdfDatasignatureBitmapData,它們分別存儲在軟件包目錄下的MainDocument.pdf和SignatureBitmap.png下。

- (BOOL)readFromFileWrapper:(NSFileWrapper *)dirWrapper 
        ofType:(NSString *)typeName 
         error:(NSError **)outError 
{ 

    NSFileWrapper *wrapper; 
    NSData *data; 

    wrapper = [[dirWrapper fileWrappers] objectForKey:@"MainDocument.pdf"]; 
    data = [wrapper regularFileContents]; 
    self.pdfData = data; 

    wrapper = [[dirWrapper fileWrappers] objectForKey:@"SignatureBitmap.png"]; 
    data = [wrapper regularFileContents]; 
    self.signatureBitmapData = data; 

    … 

    return YES; 
} 

- (NSFileWrapper *)fileWrapperOfType:(NSString *)typeName 
           error:(NSError **)outError 
{ 
    NSFileWrapper *dirWrapper = [[[NSFileWrapper alloc] 
     initDirectoryWithFileWrappers:nil] autorelease]; 

    [dirWrapper addRegularFileWithContents:self.pdfData 
     preferredFilename:@"MainDocument.pdf"]; 

    [dirWrapper addRegularFileWithContents:self.signatureBitmapData 
     preferredFilename:@"SignatureBitmap.png"]; 

    … 

    return dirWrapper; 
} 

從用戶角度來看,封裝目錄顯示出來Finder中,好像它是一個單獨的文件,很象的Xcode .xcodeproj目錄或應用程序軟件包。

+0

謝謝你的詳細解答,我會馬上試試。 – hariseldon78 2011-04-15 11:05:40

+0

@ hariseldon78乾杯。只有一點評論:我沒有在我的例子中包括錯誤檢查和報告,但是你應該在你的生產代碼中這樣做。 – 2011-04-15 11:07:26

+0

是否可以在不指定LSTypeIsPackage的情況下打開MainDocument.pdf,並使用NSFileWrapper API將文檔與圖像文件一起保存? – 2012-01-05 13:03:07