একটি সুইফ্টআইআইতে View
আমার কাছে কোনও সত্তার ডেটা এবং ওয়াইড রিলেশনশিপ সংযুক্ত সত্তার ডেটা দেখানোর List
উপর ভিত্তি করে আছে । এবং তার সঠিকভাবে আপডেট করা হয়, যখন আমি একটি নতুন যোগ একটি নতুন সংশ্লিষ্ট মাধ্যমিক সত্তা সঙ্গে সত্তা।@FetchRequest
Primary
Secondary
View
List
Primary
সমস্যাটি হ'ল, আমি যখন সংযুক্ত Secondary
আইটেমটি বিশদ দৃষ্টিতে আপডেট করি তখন ডাটাবেস আপডেট হয়, তবে পরিবর্তনগুলি Primary
তালিকাতে প্রতিফলিত হয় না । স্পষ্টতই, @FetchRequest
অন্য ভিউ-র পরিবর্তনের ফলে এগুলি ট্রিগার হয় না।
এর পরে আমি যখন প্রাথমিক ভিউতে কোনও নতুন আইটেম যুক্ত করি তখন পূর্ববর্তী পরিবর্তিত আইটেমটি শেষ পর্যন্ত আপডেট হয়।
কার্যকারণ হিসাবে, আমি অতিরিক্তভাবে Primary
সত্ত্বার একটি বৈশিষ্ট্য আপডেট করে বিশদটি পরিবর্তনগুলিতে সঠিকভাবে প্রচার করি Primary
।
আমার প্রশ্নটি: আমি কীভাবে @FetchRequests
সুইফটইউআই কোর ডেটার সাথে সম্পর্কিত সমস্ত বিষয়ে একটি আপডেট জোর করতে পারি ? বিশেষত, যখন আমার সম্পর্কিত সংস্থাগুলিতে সরাসরি কোনও প্রবেশাধিকার নেই @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
?