SwiftUI + CoreData: Preview crasht immer

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Das Console-Log täte mich auch interessieren und der vollständige Code.

    Aber die Klassiker sind

    - irgendwo vergessene Klammern
    - Kein Default-Wert bei der Ausgabe angegeben, um nil zu verhindern. Beispiel:

    Quellcode

    1. Text("Der Wert ist \(scout.name ?? "")")


    - Switch-Anweisungen in der View kann auch manchmal zu Problemen führen. Wenn nur geprüft werden soll, ob es Werte in der Abfrage gibt, reicht eine einfache

    Quellcode

    1. if scouts.count > 0 {
    2. ...
    3. } else {
    4. ...
    5. }
    Hinweis:
    das FetchResult muss man nicht erst in ein Array aus Structs umbauen. Man kann auch gleich mit ForEach auf den FetchRequest losgehen.

    Und die Summe von einem Feld aus den Datensätzen geht einfach mit

    Quellcode

    1. var sum: Double {
    2. results!.reduce(0, { $0 + $1.feldMitWert})
    3. }
    Statt $1.feldMitWert kannst du auch in Klammern eine func aufrufen und die beiden notwendigen Werte übergeben.

    Aber um genaueres zu sagen, wäre der gesamte Code sinnvoll.
  • mihema schrieb:

    Das Console-Log täte mich auch interessieren und der vollständige Code.

    Aber die Klassiker sind

    - irgendwo vergessene Klammern
    - Kein Default-Wert bei der Ausgabe angegeben, um nil zu verhindern. Beispiel:

    Quellcode

    1. Text("Der Wert ist \(scout.name ?? "")")

    - Switch-Anweisungen in der View kann auch manchmal zu Problemen führen. Wenn nur geprüft werden soll, ob es Werte in der Abfrage gibt, reicht eine einfache

    Quellcode

    1. if scouts.count > 0 {
    2. ...
    3. } else {
    4. ...
    5. }
    Hinweis:
    das FetchResult muss man nicht erst in ein Array aus Structs umbauen. Man kann auch gleich mit ForEach auf den FetchRequest losgehen.

    Und die Summe von einem Feld aus den Datensätzen geht einfach mit

    Quellcode

    1. var sum: Double {
    2. results!.reduce(0, { $0 + $1.feldMitWert})
    3. }
    Statt $1.feldMitWert kannst du auch in Klammern eine func aufrufen und die beiden notwendigen Werte übergeben.

    Aber um genaueres zu sagen, wäre der gesamte Code sinnvoll.
    da der Code im Simulator und auf dem echten iPhone/iPad läuft kann es wohl kaum eine Klammer oder ein Nil sein, oder?

    Soll ich das gesamte Projekt hochladen, oder was meinst du mit "der gesamte Code"?
  • Es gibt einen Fehlerbericht:

    pastebin.com/XecjJMK9

    Das ist einer der Views (es geht bei keiner View sobald CoreData im Spiel ist):

    Quellcode

    1. import SwiftUI
    2. struct ShiftView: View {
    3. @Environment(\.managedObjectContext) var moc
    4. @Environment(\.dismiss) var dismiss
    5. @FetchRequest(sortDescriptors: []) var locations: FetchedResults<Location>
    6. @State private var startD:Date = Date()
    7. @State private var endD:Date = Date().addingTimeInterval(TimeInterval(6.0 * 60.0 * 60.0))
    8. @State private var selectedLocation:String = ""
    9. var body: some View {
    10. VStack {
    11. HStack {
    12. Image(systemName: "calendar.circle.fill")
    13. .symbolRenderingMode(.multicolor)
    14. .font(.largeTitle)
    15. Text("Neuen Dienst eintragen")
    16. .font(.title)
    17. }
    18. DatePicker("Anfang", selection: $startD)
    19. .font(.title2)
    20. .padding(EdgeInsets(top: 0, leading: 5, bottom: 0, trailing: 5))
    21. DatePicker("Ende", selection: $endD)
    22. .font(.title2)
    23. .padding(EdgeInsets(top: 5, leading: 5, bottom: 20, trailing: 5))
    24. Picker("Bitte einen Ort auswählen", selection: $selectedLocation) {
    25. ForEach(locations) { l in
    26. Text(l.name ?? "").tag(l.name ?? "")
    27. }
    28. }
    29. .pickerStyle(.inline)
    30. Button {
    31. let newShift = Shift(context: moc)
    32. newShift.id = UUID()
    33. newShift.startDate = startD
    34. newShift.endDate = endD
    35. newShift.locationName = selectedLocation
    36. do {
    37. try moc.save()
    38. } catch let error {
    39. print(error.localizedDescription)
    40. }
    41. dismiss()
    42. } label: {
    43. Text("Speichern")
    44. .font(.title2)
    45. .bold()
    46. .frame(width: 300, height: 60)
    47. }
    48. .buttonStyle(.borderedProminent)
    49. .tint(.green)
    50. Button {
    51. dismiss()
    52. } label: {
    53. Text("Abbrechen")
    54. .font(.title3)
    55. .bold()
    56. .frame(width: 300, height: 40)
    57. }
    58. .buttonStyle(.borderedProminent)
    59. .tint(.red)
    60. .padding(EdgeInsets(top: 0, leading: 0, bottom: 0, trailing: 0))
    61. }
    62. .onAppear() {
    63. selectedLocation = locations.first?.name ?? ""
    64. }
    65. }
    66. }
    67. #Preview {
    68. ShiftView()
    69. .environment(\.managedObjectContext, DataController(name: "Location").container.viewContext)
    70. }
    Alles anzeigen


    Und die Datenstruktur sieht so aus:
    Bildschirmfoto 2023-12-21 um 07.16.21.pngBildschirmfoto 2023-12-21 um 07.16.42.png

    Grüße

    Dirk
  • Aaaaalso, was ich bis jetzt rausgefunden habe, scheint es an einer Inkompatibilität zwischen dem macOS und dem iOS in der Vorschau zu liegen.
    Das kommt gelegentlich vor.

    Am 12.12. kam ein neues Xcode raus. Damit dann wohl das Update auf iOS 17.2 in der Simulation. Jetzt müsste - so meine Vermutung - noch das macOS nachziehen.

    Das legt zumindest folgende Fehlermeldung nahe, wenn man nach dem Absturz auf "Erneut starten" klickt.

    Bildschirmfoto 2023-12-21 um 17.22.28.jpg
  • Noch aktuell?

    Bei mir läuft es jetzt. Fehler war folgendes:

    in der Persistence folgenden Code in den Struct einfügen


    Quellcode

    1. static var preview: PersistenceController = {
    2. let result = PersistenceController(inMemory: true)
    3. let viewContext = result.container.viewContext
    4. for i in 0..<10 {
    5. let newItem = Locations(context: viewContext)
    6. newItem.name = "Location \(i)"
    7. newItem.id = UUID()
    8. }
    9. do {
    10. try viewContext.save()
    11. } catch {
    12. // Replace this implementation with code to handle the error appropriately.
    13. // fatalError() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development.
    14. let nsError = error as NSError
    15. fatalError("Unresolved error \(nsError), \(nsError.userInfo)")
    16. }
    17. return result
    18. }()
    Alles anzeigen
    In der for noch ggf. die Entity anpassen.