如果這個論點已經被覆蓋了,我會感到抱歉,但經過一些研究後,我發現沒有什麼精確的。NSDocument保存完整的文件夾?
我需要製作一個基於文檔的應用程序,其中文檔實際上不是單個文件,而是文件的結構化集合。窗口將顯示包含在文件夾中的pdf,並具有特定的文件名,並使用文件夾中其他文件的信息來豐富它。 我不能使用pdf註釋來實現這一點,我真的需要保持與pdf分開的文件。
實現此目標的最佳方法是什麼?我找到的所有示例代碼都使用單個文件。
如果這個論點已經被覆蓋了,我會感到抱歉,但經過一些研究後,我發現沒有什麼精確的。NSDocument保存完整的文件夾?
我需要製作一個基於文檔的應用程序,其中文檔實際上不是單個文件,而是文件的結構化集合。窗口將顯示包含在文件夾中的pdf,並具有特定的文件名,並使用文件夾中其他文件的信息來豐富它。 我不能使用pdf註釋來實現這一點,我真的需要保持與pdf分開的文件。
實現此目標的最佳方法是什麼?我找到的所有示例代碼都使用單個文件。
可以使用NSFileWrapper
作爲基於文檔的應用程序中的軟件包目錄。
在您的應用程序Info.plist文件中,指出您的文檔類型是包或捆綁包(密鑰LSTypeIsPackage
,值爲YES
)。
在您的NSDocument
子類中,實現以下讀寫方法。在這個例子中,我假設相應的模型實例變量是pdfData
和signatureBitmapData
,它們分別存儲在軟件包目錄下的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目錄或應用程序軟件包。
謝謝你的詳細解答,我會馬上試試。 – hariseldon78 2011-04-15 11:05:40
@ hariseldon78乾杯。只有一點評論:我沒有在我的例子中包括錯誤檢查和報告,但是你應該在你的生產代碼中這樣做。 – 2011-04-15 11:07:26
是否可以在不指定LSTypeIsPackage的情況下打開MainDocument.pdf,並使用NSFileWrapper API將文檔與圖像文件一起保存? – 2012-01-05 13:03:07