Как создать закладку на уровне документа для сохранения в новом документе?

У меня есть изолированное приложение для Mac, основанное на документах. Мои документы содержат изображения на компьютерах пользователей. Я хочу сохранить закладку в области документа для изображения, используемого в моем документе, чтобы иметь доступ к изображению при закрытии и повторном открытии документа.

Вот как я создаю закладку:

 //path is path to an image
 //for a new document docUrl is set to the location where we will save our document
 NSURL * pathUrl = [NSURL fileURLWithPath:path];
 NSError * error;
 NSData * pathBookmarkData = [pathUrl bookmarkDataWithOptions:
                              (NSURLBookmarkCreationWithSecurityScope 
                             | NSURLBookmarkCreationSecurityScopeAllowOnlyReadAccess)
                              includingResourceValuesForKeys:[NSArray arrayWithObject:NSURLPathKey] 
                             relativeToURL:docUrl error:&error];

это приводит к следующей ошибке:

Error Domain=NSCocoaErrorDomain Code=260 "The file “Untitled.mydocext” couldn’t be opened because there is no such file." (Collection URL points to a file that doesn't exist) UserInfo=0x608000070800 {NSURL=file:///Users/myname/Pictures/Untitled.mydocext, NSDebugDescription=Collection URL points to a file that doesn't exist}

Как создать закладку на уровне документа для сохранения в новом документе?

Вот как я получаю путь:

NSArray* fileTypes = [[NSArray alloc] initWithObjects:@"png", @"jpg", @"jpeg", @"bmp", @"gif", @"tif", @"tiff", @"PNG", @"JPG", @"JPEG", @"BMP", @"GIF", @"TIF", @"TIFF", nil];

NSOpenPanel *panel;

panel = [NSOpenPanel openPanel];
[panel setTitle:@"Select Photos"];

[panel setFloatingPanel:YES];

[panel setCanChooseDirectories:YES];
[panel setCanChooseFiles:YES];
[panel setAllowsMultipleSelection:YES];
[panel setAllowedFileTypes:fileTypes];

[panel beginWithCompletionHandler:^(NSInteger result){
    if (result == NSFileHandlingPanelOKButton) {
        NSMutableArray * pathsArray = [[NSMutableArray alloc] init];
        NSArray * urlArray = [panel URLs];
        for (NSURL * url in urlArray) {
            //this is how I get path to image, assume I am not selecting directories
            NSString * path = [url path];
        }
    }
}];

person AmaltasCoder    schedule 01.01.2015    source источник
comment
Как вы получили «путь»? Предпочтительным способом было бы использовать NSOpenPanel для получения URL-адреса с областью безопасности или пользователя, перетаскивающего изображение в ваше приложение.   -  person mahal tertin    schedule 02.01.2015
comment
Я откладываю получение закладки с областью безопасности до тех пор, пока пользователь не попытается сохранить мой документ в первый раз. Это когда я получаю место, где я буду сохранять документ и, следовательно, относительный URL-адрес для использования в bookmarkDataWithOptions:IncludeResourceValuesForKeys:relativeToURL:error: функция для получения закладки в области документа.   -  person AmaltasCoder    schedule 02.01.2015
comment
@AmaltasCoder, вы когда-нибудь решали эту проблему? Я пытаюсь сделать то же самое, но различные ошибки в OSX мешают мне правильно/надежно сохранить документ с закладками внутри него.   -  person Remco Poelstra    schedule 28.02.2016


Ответы (1)


Нет необходимости откладывать создание SSB. Также переход к пути, а затем обратно к URL-адресу может вызвать некоторые проблемы с песочницей. Попробуйте использовать что-нибудь из следующего:

    // the URLs come back with access to it. they are added to the sandbox by the panel. no need to do anything like start accessing security scoped.
    NSArray * urlArray = [panel URLs];

    for (NSURL *urlToStore in urlArray) {
        // create a SSB out of the URL
        NSError *erroer = nil;
        NSData *bookmarkData = nil;
        bookmarkData = [urlToStore bookmarkDataWithOptions:(NSURLBookmarkCreationWithSecurityScope| NSURLBookmarkCreationSecurityScopeAllowOnlyReadAccess)
                            includingResourceValuesForKeys:nil
                                             relativeToURL:docUrl
                                                     error:&erroer];
        if (erroer) {
            NSLog(@"couldn't create NSURLBookmarkCreationWithSecurityScope with error: %@", [erroer description]);
        } else if ( bookmarkData ) {
            // store the bookmark data either in the document or internally for later persistency
        } else {
            NSLog(@"no error and no bookmarkData: %@", [self description]);
        }
     }
person mahal tertin    schedule 13.01.2015