Я провел много исследований по этому поводу, но не смог найти действенного решения этой проблемы. Мои знания и опыт работы с Swift и SwiftUI/SwiftData/AppKit/UIKit ограничены, поэтому я, вероятно, не правильно вижу проблему, чтобы найти решение.
Фон:
Я пытаюсь создать универсальное приложение для macOS/iOS, которое организует медиафайлы (изображения/видео/pdf); думайте о его функциональности как о приложении Apple Photos. Итак, для моего типа документа приложения у меня будет собственный пакет файлов, а в папке пакета будут файл-контейнер модели SwiftData и папки для хранения пользовательских медиафайлов.
Принятые подходы:
В сцене моего приложения я создаю документ, используя DocumentGroup(editing: .customDocument,migrationPlan: CustomMigrationPlan.self). Это создаст документ с контейнером модели с моей моделью SwiftData. И когда мне нужно добавить медиафайлы в документ, я получаю URL-адрес документа, а затем использую FileManager, чтобы записать файл в нужную папку в документе. В результате медиафайл сохраняется в пакете файлов, но затем контейнер SwiftData повреждается (все данные модели сбрасываются до пустых).
Сейчас я пытаюсь:
В моем нынешнем подходе я бы создал документ, используя DocumentGroup(newDocument: CustomFileDocument()). У меня есть собственные FileDocument и FileWrapper. Но проблема в том, что я не знаю, как встроить контейнер SwiftData в свой FileDocument. Можно ли создать контейнер модели SwiftData при инициализации моего FilerWrapper? Я не могу понять, как это сделать.
Может ли кто-нибудь посоветовать, как мне это сделать? Или, может быть, я неправильно смотрю на эту проблему? Нужно ли мне использовать AppKit/UIKit с Core Data, поскольку в настоящее время это невозможно с помощью SwiftUI/SwiftData?
Большое спасибо за чтение, и любой вклад очень ценится.
Для этого вы можете использовать ModelDocument . И есть пример Создание приложения на основе документов с использованием SwiftData и видео Создание приложения с помощью SwiftData (WWDC 2023).
например
@main
struct Todo: App {
var body: some Scene {
DocumentGroup(editing: TodoItem.self, contentType: .todoItem) {
ContentView()
}
}
}
struct ContentView: View {
@Query var items: [TodoItem]
var body: some View {
List {
ForEach(items) { item in
@Bindable var item = item
Toggle(item.text, isOn: $item.isDone)
}
}
}
}
@Model
final class TodoItem {
var created: Date
var text: String
var isDone = false
}
extension UTType {
static var todoItem = UTType(exportedAs: "com.myApp.todoItem")
}
Проблема, с которой вы, вероятно, столкнетесь, заключается в том, что пользовательский интерфейс документа предназначен для открытия разных файлов, а не всегда одного и того же файла библиотеки. Вам также, вероятно, следует проверить, что Swift Data не сломается, если файл будет перемещен, пока он открыт.
Отлично, на случай, если это поможет, я добавил только что найденный образец побольше.
Большое спасибо. Используя инициализатор сцены DocumentGroup(редактирование: Card.self, contentType: <#UTType#>) вместо DocumentGroup(редактирование: <#UTType#>,migrationPlan: <#SchemaMigrationPlan#>), я смог записать в файл документа. Вы мне очень помогли. Спасибо.