Как обрабатывать различные типы документов в приложении macOS на основе документов?

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

Начиная с шаблона приложения для документов macOS, я определяю два типа, которые также зарегистрированы в info.plist:

extension UTType {
    static var test1: UTType {
        UTType(exportedAs: "com.exapmple.test1")
    }
}

extension UTType {
    static var test2: UTType {
        UTType(exportedAs: "com.example.test2")
    }
}

Apple документация говорит:

Your app can support multiple document types by adding additional document group scenes:

Но в показанном примере есть только один тип, который можно создать, а другой доступен только для чтения (режим редактора).

Если я сделаю это в основной структуре приложения (которая в основном является шаблоном из шаблона:

@main
struct MultipleDocumentsApp: App {
    var body: some Scene {
        DocumentGroup(newDocument: DocumentOne()) { file in
            Content1View(document: file.$document)
        }
        DocumentGroup(newDocument: DocumentTwo()) { file in
            Content2View(document: file.$document)
        }
    }
}

.. результирующее новое меню выглядит так, и я могу создавать документы только типа 1:

enter image description here

Очевидно, мне потребуются два разных пункта меню New... для двух типов документов. Любые идеи, как я могу этого добиться?

1
0
34
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

Итак, все, что вы сделали правильно, осталось только добавить программно создание нового документа другого (не используемого по умолчанию) типа.

Вот основная часть подхода:

Button("New Document2") {
  let dc = NSDocumentController.shared
  if let newDocument = try? dc.makeUntitledDocument(ofType: "com.example2.plain-text") {
    dc.addDocument(newDocument)
    newDocument.makeWindowControllers()
    newDocument.showWindows()
  }
}

Завершить выводы и код здесь

Другие вопросы по теме