Ниже приведен минимальный код, вызывающий сбой. Чего я хочу достичь: передать представление AchievementB по умолчанию, а затем изменить (на основе ввода пользователя) и вставить в достижения.
обновление: после нескольких попыток кажется, что я не могу инициализировать объект до появления представления, но я не знаю, почему.
import SwiftData
import SwiftUI
@Model
class AchievementB: Identifiable {
let id: UUID = UUID()
init(id: UUID = UUID()) {
self.id = id
}
}
struct AchievementView: View {
@State var options: AchievementB
@Environment(\.modelContext) private var modelContext
@Query var achievements: [AchievementB]
var body: some View {
Text("hello")
}
}
#Preview {
AchievementView(options: AchievementB())
.modelContainer(for: AchievementB.self)
}
это верно
У меня это не крашится. Правильно ли вы настроили ModelContainer для самого приложения?
это весь код, который у меня есть. о какой настройке вы говорите?
В коде вашего приложения в <имя моего приложения>.swift вы также должны добавить модификатор .modelContainer в WindowGroup.
для этого он у меня есть: WindowGroup { AchievementView(options: AchievementB()) } .modelContainer(for: [AchievementB.self])
Возможно, вам просто нужно очистить папку сборки или что-то в этом роде, потому что на iOS 17.5 (Xcode 15.4) ваш код работает нормально, как и на моем компьютере.





В вашем коде объект AchievementB создается до существования контейнера модели. AchievementB() выполняется первым, перед модификатором .modelContainer(for: ...), который создает контейнер модели.
Прежде чем создавать какие-либо объекты @Model, вам следует сначала создать контейнер модели, поскольку для работы свойств объектам @Model необходим контейнер модели. Когда вы получаете/устанавливаете свойство объекта @Model, фактическое чтение и запись данных делегируется контейнеру модели.
Сначала вам следует вручную создать ModelContainer, а затем добавить его в представление, используя другую перегрузку модификатора modelContainer.
#Preview {
let config = ModelConfiguration(isStoredInMemoryOnly: true)
let container = try! ModelContainer(for: AchievementB.self, configurations: config)
return AchievementView(options: AchievementB())
.modelContainer(container)
}
Обратите внимание, что вам необходимо явно указать return, поскольку #Preview не является построителем представлений.
Примечание: options не должно быть @State, если вы собираетесь передать ему что-то. Это должен быть обычный let/var или @Bindable, если вы хотите получить от него Binding.
В Xcode 15.4 это, похоже, не нужно, и наличие только AchievementView(options: AchievementB()).modelContainer(for: AchievementB.self, inMemory: true) в макросе #Preview работает нормально.
@JoakimDanielson Ах, это интересно. Я (и, вероятно, ОП тоже) использую Xcode 15.3.
Итак, вы запускаете это в Xcode Previews?