如果这个论点已经被覆盖了,我会感到抱歉,但经过一些研究后,我发现没有什么精确的。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