SwiftUI ObservableObject muss raus?
Ich bekomme andauernd den Fehler "Cannot preview in this file" und glaube den Fehler im ObservableObject gefunden zu haben. Das Problem ist halt, dass ich einige Lösungen im Internet benutzt habe, die mich anfangs weitergebracht haben aber jetzt mich dran hindern weiterzukommen. Auf jeden Fall glaube ich, dass das ObservableObject weg muss aber ich scheitere dran wie ich es rausnehme.
Ich vermute es, da mir einer andere Meldung folgendes sagt:
Thread 1: Fatal error: No ObservableObject of type ModelData found. A View.environmentObject(_:) for ModelData may be missing as an ancestor of this view.
Da ich nach meinem Verständnis aber eigentlich kein ObservableObject brauche denke ich muss es raus.
Für Alternativen und einer Belehrung bin ich trotzdem offen ^^
import SwiftUI
struct CategoryHome: View {
@EnvironmentObject var modelData: ModelData
var body: some View {
NavigationView {
List{
Image("Denkmal")
.resizable()
.scaledToFill()
.frame(height: 200)
.clipped()
.listRowInsets(EdgeInsets())
ForEach(modelData.categories.keys.sorted(), id: \.self) { key in
CategoryRow(categoryName: key, items: modelData.categories[key]!)
}
.listRowInsets(EdgeInsets())
}
.navigationTitle("Featured")
}
}
}
struct CategoryHome_Previews: PreviewProvider {
static var previews: some View {
CategoryHome()
}
}
import Foundation
import Combine
final class ModelData: ObservableObject {
@Published var GeschichteJN: [GeschichteDekl] = load("GeschichteData.json")
var categories: [String: [GeschichteDekl]] {
Dictionary(
grouping: GeschichteJN,
by: { $0.category.rawValue }
)
}
}
func load<T: Decodable>(_ filename: String) -> T {
let data: Data
guard let file = Bundle.main.url(forResource: filename, withExtension: nil)
else {
fatalError("Couldn't find \(filename) in main bundle.")
}
do {
data = try Data(contentsOf: file)
} catch {
fatalError("Couldn't load \(filename) from main bundle:\n\(error)")
}
do {
let decoder = JSONDecoder()
return try decoder.decode(T.self, from: data)
} catch {
fatalError("Couldn't parse \(filename) as \(T.self):\n\(error)")
}
}
1 Antwort
Wenn dein View Daten braucht (egal ob Observable oder nicht), dann musst du diese in der Preview natürlich auch übergeben. Das kann so aussehen:
struct CategoryHome_Previews: PreviewProvider {
@ObservedObject static var modelData = ModelData()
static var previews: some View {
CategoryHome()
.environmentObject(modelData)
}
}
Cannot preview in this file
Couldn't parse GeschichteData.json as Array<GeschichteDekl>:
CrashReportError: Fatal Error in ModelData.swift
In der JSON-Datei gibt es aber auch keine Fehler auf die ich schließen könnte.
klappt nicht