Bir SwiftUI olarak View
i sahip List
göre @FetchRequest
bir verilerini gösteren Primary
bir varlık ve ilişki üzerinden, Secondary
varlık. View
Ve onun List
yeni bir eklediğinizde, doğru güncellenir Primary
Yeni bir ilgili ikincil varlık ile varlık.
Sorun, bağlı Secondary
öğeyi bir ayrıntı görünümünde güncelleştirdiğimde, veritabanı güncelleştirilir, ancak değişiklikler Primary
Listeye yansıtılmaz . Açıkçası, @FetchRequest
başka bir Görünümdeki değişiklikler tarafından tetiklenmez.
Daha sonra birincil görünümde yeni bir öğe eklediğimde, daha önce değiştirilen öğe nihayet güncellenir.
Geçici bir çözüm olarak, Primary
ayrıntı görünümünde varlığın bir özniteliğini de güncelleştiririm ve değişiklikler Primary
Görünüm'e doğru şekilde yayılır .
Benim sorum: @FetchRequests
SwiftUI Temel Verileri ile ilgili tüm güncellemeleri nasıl zorlayabilirim ? Özellikle, ilgili varlıklara doğrudan erişimim olmadığında / @Fetchrequests
?
import SwiftUI
extension Primary: Identifiable {}
// Primary View
struct PrimaryListView: View {
@Environment(\.managedObjectContext) var context
@FetchRequest(
entity: Primary.entity(),
sortDescriptors: [NSSortDescriptor(key: "primaryName", ascending: true)]
)
var fetchedResults: FetchedResults<Primary>
var body: some View {
List {
ForEach(fetchedResults) { primary in
NavigationLink(destination: SecondaryView(primary: primary)) {
VStack(alignment: .leading) {
Text("\(primary.primaryName ?? "nil")")
Text("\(primary.secondary?.secondaryName ?? "nil")").font(.footnote).foregroundColor(.secondary)
}
}
}
}
.navigationBarTitle("Primary List")
.navigationBarItems(trailing:
Button(action: {self.addNewPrimary()} ) {
Image(systemName: "plus")
}
)
}
private func addNewPrimary() {
let newPrimary = Primary(context: context)
newPrimary.primaryName = "Primary created at \(Date())"
let newSecondary = Secondary(context: context)
newSecondary.secondaryName = "Secondary built at \(Date())"
newPrimary.secondary = newSecondary
try? context.save()
}
}
struct PrimaryListView_Previews: PreviewProvider {
static var previews: some View {
let context = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext
return NavigationView {
PrimaryListView().environment(\.managedObjectContext, context)
}
}
}
// Detail View
struct SecondaryView: View {
@Environment(\.presentationMode) var presentationMode
var primary: Primary
@State private var newSecondaryName = ""
var body: some View {
VStack {
TextField("Secondary name:", text: $newSecondaryName)
.textFieldStyle(RoundedBorderTextFieldStyle())
.padding()
.onAppear {self.newSecondaryName = self.primary.secondary?.secondaryName ?? "no name"}
Button(action: {self.saveChanges()}) {
Text("Save")
}
.padding()
}
}
private func saveChanges() {
primary.secondary?.secondaryName = newSecondaryName
// TODO: ❌ workaround to trigger update on primary @FetchRequest
primary.managedObjectContext.refresh(primary, mergeChanges: true)
// primary.primaryName = primary.primaryName
try? primary.managedObjectContext?.save()
presentationMode.wrappedValue.dismiss()
}
}
ObservableObject
mi?