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

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

Как настроить мой документ или типы документов, чтобы сделать его таким, чтобы новый документ был создан с данными из исходного документа, вместо того, чтобы оригинал был открыт?

cocoa,document-based,

4

Ответов: 3


11 принят

1. Объявлять типы файлов как типы документов

В рамках проекта Xcode добавьте Тип документа для всех форматов файлов, поддерживаемых вашим приложением. Задайте роль каждого типа в соответствии с возможностями вашего приложения:

  • Отметьте типы файлов для чтения / записи в качестве редактора ;
  • Отметить импортировать только типы файлов в качестве средства просмотра .

Установите класс в тип документа, который вы хотите обрабатывать с каждым типом файла. Один класс документа может обрабатывать несколько типов файлов.

В приведенном ниже примере указаны три типа файлов: font-pestle, otf и ttf. Первый, font-pestle - это собственный формат приложения. Этот тип имеет роль Editor .

Остальные два формата: otf и ttf могут быть импортированы, но не записаны приложением; таким образом, они отмечены как Viewer .

Примеры типов документов

2. Дополнительные типы файлов в файле readFromData: ofType: error: subclass

При добавлении типов документов приложение автоматически разрешит пользователям открывать файлы указанных типов.

Вам нужно добавить код обработки типа файла в класс документа. В идеальном случае добавьте код ветвления к методу:- (BOOL)readFromData:(NSData*)someData ofType:(NSString*)typeName error:(NSError**)outError { if ([NSWorkspace.sharedWorkspace type:@"eu.miln.font-pestle" conformsToType:typeName] == YES) { // read native format } else if ([NSWorkspace.sharedWorkspace type:@"public.opentype-font" conformsToType:typeName] == YES) { // read import only format // disassociate document from file; makes document "untitled" self.fileURL = nil; // associate with primary file type self.fileType = @"eu.miln.font-pestle"; } else // ... }

self.fileURL = nil;

Это autosavingFileTypeважно. Установив файлURL на нуль, вы говорите, что документ не связан с каким-либо файлом на диске и должен рассматриваться как новый документ.

Чтобы разрешить автосохранение, реализовать - ( BOOL ) readFromData :( NSData *) данные OfType :( NSString *) ошибка TYPENAME :( NSError **) outError { * outError = ноль ; if ([ typeName isEqualToString : @ "SomeReadOnlyType" ]) { // .. (загружать данные здесь) [ self setFileURL : nil ]; результат возврата ; } Еще { // .. (делать все , что вы делаете для других документов здесь) } } способ вернуть первичный тип файла. openDocumentWithContentsOfURL:display:error:


4

Алекс, спасибо за ваш ответ, но я нашел способ, которым мне больше нравится:

NSDocumentController

Таким образом, по-прежнему можно использовать систему документов, предоставляемую Cocoa, вместо того чтобы кататься самостоятельно.

Я также документировал решение здесь: http://www.cocoadev.com/index.pl?CFBundleTypeПодробнее на странице.


1

Я не верю, что функция импорта по умолчанию поддерживается в Cocoa. Когда пользователь нажимает на кнопку Открыть в открытой панели, каркас вызывает NSDocumentна NSDocumentController. Вот где система документов определяет тип файла, который вы открываете, и проконсультируется с файлом Info.plist, чтобы выяснить, какой NSDocumentподкласс использовать для открытия документа.

Вы можете подклассифицировать openDocumentWithContentsOfURL:display:error:и переопределить NSDocumentметод для перехвата типов файлов, которые необходимо импортировать, а не открывать. В вашем NSDocumentподклассе напишите новый инициализатор с таким именем initWithImportedContentsOfURL:type:error:(или чем-то с лучшим именем :-)), чтобы создать новый документ без названия и прочитать содержимое импортированного файла.

какао, документ на основе
Похожие вопросы