我很抱歉是否已经涵盖了这个论点,但是经过一些研究,我发现没有任何确切的内容。
我需要制作一个基于文档的应用程序,其中文档实际上不是单个文件,而是目录中的结构化文件集合。窗口将显示文件夹中包含的具有特定文件名的 pdf,并使用文件夹中其他文件的信息来丰富它。我不能使用 pdf 注释来实现这一点,我真的需要将文件与 pdf 分开。
实现这一目标的最佳方法是什么?我发现的所有示例代码都使用一个文件..
我很抱歉是否已经涵盖了这个论点,但是经过一些研究,我发现没有任何确切的内容。
我需要制作一个基于文档的应用程序,其中文档实际上不是单个文件,而是目录中的结构化文件集合。窗口将显示文件夹中包含的具有特定文件名的 pdf,并使用文件夹中其他文件的信息来丰富它。我不能使用 pdf 注释来实现这一点,我真的需要将文件与 pdf 分开。
实现这一目标的最佳方法是什么?我发现的所有示例代码都使用一个文件..
您可以NSFileWrapper
在基于文档的应用程序中用作包目录。
在您的应用程序 Info.plist 文件中,声明您的文档类型是包或捆绑包(LSTypeIsPackage
带有 value的键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 目录或应用程序包。