Добрый вечер,
Я реализую базу данных Realm с помощью SwiftUI. База данных состоит из таблицы, содержащей «Проекты», и таблицы, содержащей «Меры» (отношение один ко многим). В главном окне отображается список проектов, а в «Представлении измерений» отображаются меры, связанные с выбранным проектом.
Когда я выбираю проект, отображается список мер, а затем невозможно 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 на простое текстовое представление, поведение будет очень странным: я выбираю проект, приложение показывает текстовое представление и автоматически возвращается к основному списку (списку проектов). Если кто-то может мне помочь, я был бы признателен. Большое спасибо за вашу поддержку.
Джефф