Сбой списка представлений базы данных Swifui Realm - PullRequest
0 голосов
/ 01 февраля 2020

Добрый вечер,

Я реализую базу данных Realm с помощью SwiftUI. База данных состоит из таблицы, содержащей «Проекты», и таблицы, содержащей «Меры» (отношение один ко многим). В главном окне отображается список проектов, а в «Представлении измерений» отображаются меры, связанные с выбранным проектом.

Contentview

Measureview

Когда я выбираю проект, отображается список мер, а затем невозможно go вернуться назад, приложение вылетает (симулятор и реальное устройство). XCode указывает файл AppDelegate: Тема 1: EXC_BAD_ACCESS (код = 2, адрес = 0x7ffedfd5cfd8) Я знаю, что 4/5 месяцев go, некоторые разработчики сталкивались с этой проблемой, но я полагаю, что в настоящее время Apple исправляет проблему , Ниже приведен соответствующий код:

Часть области:

import Foundation
import RealmSwift
import Combine

class Project : Object, Identifiable  {

    @objc dynamic var ProjectName = "" // primary key
    @objc dynamic var ProjectCategorie = ""
    @objc dynamic var ProjectCommentaire = ""

    let Measures = List<Measure>() // one to many

   override static func primaryKey() -> String? {
        return "ProjectName"
    }
}

class Measure : Object, Identifiable {

   // @objc dynamic var id_Measure = UUID().uuidString // primary key
    @objc dynamic var MeasureName = ""
    @objc dynamic var MeasureDetail = ""
    @objc dynamic var MeasureResult = ""
    override static func primaryKey() -> String? {
        return "MeasureName"
    }
}

func createProject (_ title:String,_ categorie:String, _ commentaire:String) {
    let realm = try! Realm()

    let proj = Project()
    proj.ProjectName = title
    proj.ProjectCategorie = categorie
    proj.ProjectCommentaire = commentaire
    try! realm.write {
           realm.add(proj)
       }
}

//****************************************************************




class BindableResults<Element>: ObservableObject where Element: RealmSwift.RealmCollectionValue {

     let didChange = PassthroughSubject<Void, Never>()

      let results: Results<Element>
      private var token: NotificationToken!

      init(results: Results<Element>) {
          self.results = results
          lateInit()
      }

      func lateInit() {
          token = results.observe { _ in
              self.didChange.send(())
          }
      }

      deinit {
          token.invalidate()
      }
}

Просмотр содержимого:

 struct ContentView : View {


    @ObservedObject var Proj = BindableResults(results: try! Realm().objects(Project.self))


     var body: some View {
        NavigationView{
            List(Proj.results) { item in
                NavigationLink(destination:  MeasureView(Pro: item) ){
                ContenRowUI(Proj :item)

                }

               }

            }
         .navigationBarTitle(Text("Project List"))

        }  
    }

Вид измерения:

struct MeasureView: View {
    var Pro = Project() //= Project()


    var body: some View {
        NavigationView {
       List(Pro.Measures) { item in
            Text("Detail: \(item.MeasureDetail)")
       }
        .navigationBarTitle(Text("Measure"))
    }
    }
}

Дополнительная информация Если я заменим Measureview на простое текстовое представление, поведение будет очень странным: я выбираю проект, приложение показывает текстовое представление и автоматически возвращается к основному списку (списку проектов). Если кто-то может мне помочь, я был бы признателен. Большое спасибо за вашу поддержку.

Джефф

...