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)")
}
}