理解核心数据,在SwiftUI中在视图之间传递数据

理解核心数据,在SwiftUI中在视图之间传递数据,swift,xcode,core-data,swiftui,nsfetchrequest,Swift,Xcode,Core Data,Swiftui,Nsfetchrequest,我正在尝试使用CoreData和SwiftUI创建一个小项目 我创建了两个简单的实体,一个叫做Airport,属性为icaoAPT,另一个叫做Briefing,属性为note 两者之间的关系,每个机场都应该有很多值得注意的地方 在contentView上,我成功地创建了一个列表,其中显示了插入的所有文件 import SwiftUI struct ContentView: View { @Environment(\.managedObjectContext) var managedO

我正在尝试使用CoreData和SwiftUI创建一个小项目

我创建了两个简单的实体,一个叫做Airport,属性为icaoAPT,另一个叫做Briefing,属性为note

两者之间的关系,每个机场都应该有很多值得注意的地方

在contentView上,我成功地创建了一个列表,其中显示了插入的所有文件

import SwiftUI

struct ContentView: View {
    @Environment(\.managedObjectContext) var managedObjectContext
    //Lista aeroporti
    @FetchRequest(
        entity: Airport.entity(),
        sortDescriptors: [ NSSortDescriptor(keyPath: \Airport.icaoAPT, ascending: true) ]
    ) var apt: FetchedResults<Airport>
    
    var body: some View {
        NavigationView {
            List{
                ForEach(apt, id: \.self) { airp in
                    NavigationLink(destination: DeatailsView(briefing: airp)) {
                        HStack{
                        Text(airp.icaoAPT ?? "Not Avail")
                        }
                    }
                }
            }.navigationBarTitle(Text("Aeroporti"))
                .navigationBarItems(trailing: NavigationLink(destination: AddView(), label: {
                    Text("add data")
                }))
        }
    }
}

在detailsView上,我想显示与该机场相关的注释,但我编写的代码不起作用,我觉得我应该在detailsView上放置一个NSFetch,用于过滤该机场的注释。。。。但我不知道怎么写

我的详细信息视图:

import SwiftUI

struct DeatailsView: View {
    @Environment(\.managedObjectContext) var dbContext
    @Environment(\.presentationMode) var presentation
    @State var briefing : Airport
    @FetchRequest(
        entity: Briefing.entity(),
        sortDescriptors: []) var noteAPT: FetchedResults<Briefing>
    
    var body: some View {
        VStack{
            ForEach(noteAPT, id: \.self) { dt in
                Text(dt.note ?? "Nt avail")
            }
        }
        .navigationBarTitle( Text(briefing.icaoAPT ?? "apt not avail"))
        .navigationBarItems(trailing: NavigationLink(destination: AddNote(airport: briefing), label: {
            Text("add Note")
        }))
    }
}
我总是看到我为每个机场添加的注释相同,但每个机场的注释应该不同


感谢您的帮助

如果您希望每个机场都有许多注释,我建议更改您的数据模型,使其接受两者之间的“一对多”关系

回答主要问题;为了能够过滤,您需要根据您选择的机场过滤结果。这很好地解释了这一点,并使用NSPredicate进行了更详细的说明

import SwiftUI

struct DeatailsView: View {
    @Environment(\.managedObjectContext) var dbContext
    @Environment(\.presentationMode) var presentation
    @State var briefing : Airport
    @FetchRequest(
        entity: Briefing.entity(),
        sortDescriptors: []) var noteAPT: FetchedResults<Briefing>
    
    var body: some View {
        VStack{
            ForEach(noteAPT, id: \.self) { dt in
                Text(dt.note ?? "Nt avail")
            }
        }
        .navigationBarTitle( Text(briefing.icaoAPT ?? "apt not avail"))
        .navigationBarItems(trailing: NavigationLink(destination: AddNote(airport: briefing), label: {
            Text("add Note")
        }))
    }
}
struct AddNote: View {
    @State var note : String = ""
       @Environment(\.presentationMode) var presentation
       @Environment(\.managedObjectContext) var dbContext
        @State var airport : Airport
    var body: some View {
        VStack{
            TextField("Note", text: self.$note)
                   .textFieldStyle(RoundedBorderTextFieldStyle())
                   Button(action: {
                       
                    let newNOTE = Briefing(context: self.dbContext)
                    newNOTE.note = self.note
                    
                       do {
                           try self.dbContext.save()
                           self.presentation.wrappedValue.dismiss()
                           
                       } catch {
                           print("errore nel salva")
                       }
                   }) {
                    Text("Save Note for\(airport.icaoAPT ?? "NA")")
                   }
               }.padding()
    }
}