2013-12-23 3 views
2

Мое приложение имеет собственный формат, для которого он зарегистрирован в Info.plist как редактор и может читать и записывать в этот формат. Он также может читать ряд других форматов, но не может писать им. Для этих форматов он регистрируется в Info.plist как средство просмотра.Настройка NSDocument для сохранения неродного типа

Когда я открываю один из других форматов, все кажется прекрасным, но когда я прихожу, чтобы сохранить файл, мне NSDocument отправляет сообщение writeToURL:ofType:error: с URL-адресом загруженного файла и типом в качестве UTI формата I не может писать.

-(NSArray *)writableTypes возвращает только UTI своего пользовательского формата, а -(BOOL)isNativeType: возвращает YES только для UTI моего пользовательского формата.

Что бы я хотел сделать, как и другие приложения, которые имеют собственный формат, но могут читать из других форматов, когда пользователь нажимает кнопку «Сохранить», открывается панель сохранения, и пользователь выбирает имя файла, в котором следует сохранять как родной тип.

Это что-то, что NSDocument может сделать сам, или мне нужно проверить в writeToURL:ofType:error:, чтобы узнать, нужно ли мне вручную открывать панель сохранения?

ответ

3

Отвечая на вопрос, решение, которое, как мне кажется, работает, находится в readFromURL:ofType:error:, чтобы сбросить файл NSDocument файлаURL, displayName и fileType для не-родных форматов.

- (BOOL)readFromURL:(NSURL *)url ofType:(NSString *)type error:(NSError **)error 
{ 
    // Handle loading as normal 

    if (![type isEqualToString:kMyNativeType]) { 
     [self setFileType:kMyNativeType]; 
     [self setFileURL:nil]; 

     // Without this, all non-native files are displayed as Untitled. 
     // This sets the window title as the filename without the extension 
     NSArray *filenameComponents = [[url lastPathComponent] componentsSeparatedByString:@"."]; 
     [self setDisplayName:filenameComponents[0]]; 
    } 

    return YES; 
} 

Я не знаю, если это правильный путь, но это, кажется, работает для того, что я хочу в данный момент, и кажется, что предлагается в https://developer.apple.com/library/mac/documentation/DataManagement/Conceptual/DocBasedAppProgrammingGuideForOSX/AdvancedTopics/AdvancedTopics.html#//apple_ref/doc/uid/TP40011179-CH7-SW8

+0

Спасибо! Это помогло мне. – infobug

+1

Можно также удалить расширение файла в заголовке окна без использования NSArray. Что-то вроде этого: NSString * filenameWithoutExtension = [[url lastPathComponent] stringByDeletingPathExtension]; – infobug

+0

Ответ Правильный способ сделать это, но стоит указать (для тех, кто использует 'readFromData (data: NSData, ofType typeName: String)'), что вы должны 'setDisplayName' ПОСЛЕ установки' fileURL = nil'. – Grimxn

Смежные вопросы