NSDocument для хранения полной папки? - PullRequest
9 голосов
/ 14 апреля 2011

Прошу прощения, если этот аргумент уже раскрыт, но после некоторых исследований я не нашел ничего точного.

Мне нужно создать приложение на основе документов, где документ на самом деле представляет собой не один файл, а структурированную коллекцию файлов в каталоге.Окна покажут PDF-файл, содержащийся в папке, с конкретным именем файла и дополнят его информацией из других файлов в папке.Я не могу использовать pdf-аннотации для этого, мне действительно нужно хранить файлы отдельно от pdf.

Каков наилучший подход для достижения этой цели?Все примеры кода, которые я нашел, используют один файл ..

1 Ответ

13 голосов
/ 15 апреля 2011

Вы можете использовать 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 или пакеты приложений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...