NSDocument для хранения полной папки?

#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?