#objective-c #cocoa #directory #nsdocument
#objective-c #cocoa #каталог #nsdocument
Вопрос:
Прошу прощения, если этот аргумент уже рассматривался, но после некоторого исследования я не нашел ничего точного.
Мне нужно создать приложение на основе документов, где документ фактически представляет собой не один файл, а структурированную коллекцию файлов в каталоге. Windows покажет PDF-файл, содержащийся в папке, с определенным именем файла и обогатит его информацией из других файлов в папке. Я не могу использовать аннотации pdf для достижения этой цели, мне действительно нужно хранить файлы отдельно от pdf.
Каков наилучший подход для достижения этой цели? Во всех примерах кода, которые я нашел, используется один файл..
Ответ №1:
Вы можете использовать NSFileWrapper
в качестве каталога пакета в приложениях на основе документов.
В вашем файле application 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 или пакеты приложений.
Комментарии:
1. Спасибо за подробный ответ, я попробую это немедленно.
2. @hariseldon78 Приветствую. Только одно замечание: я не включил проверку ошибок и создание отчетов в свой пример, но вы должны сделать это в своем производственном коде.
3. Можно ли открыть MainDocument.pdf без указания LSTypeIsPackage и просто сохранить документ вместе с файлом изображения, используя NSFileWrapper API?