Core data 如何处理SwiftUI视图之间的主/明细核心数据

Core data 如何处理SwiftUI视图之间的主/明细核心数据,core-data,swiftui,master-detail,Core Data,Swiftui,Master Detail,我正在处理如何将主视图中选择的参数传递给详细视图中的CoreData谓词的问题。我有这个主视图 struct ContentView: View { @State private var selectedCountry: Country? @State private var showSetting = false @FetchRequest(entity: Country.entity(), sortDescriptors: [NSSortDescriptor(

我正在处理如何将主视图中选择的参数传递给详细视图中的CoreData谓词的问题。我有这个主视图

struct ContentView: View {

@State private var selectedCountry: Country?
@State private var showSetting = false

@FetchRequest(entity: Country.entity(),
              sortDescriptors: [NSSortDescriptor(keyPath: \Country.cntryName, ascending: true)]
) var countries: FetchedResults<Country>

var body: some View {
    NavigationView {
        VStack {
            Form {
                Picker("Pick a country", selection: $selectedCountry) {
                    ForEach(countries, id: \.self) { country in
                        Text(country.cntryName ?? "Error").tag(country as Country?)
                    }
                }
                if selectedCountry != nil {
                    Years(cntryName: selectedCountry?.cntryName! ?? "")
                }
            }
        }
        .navigationBarTitle("UNECE Data")
        .navigationBarItems(trailing: Button("Settings", action: {
            self.showSetting.toggle()
        }))
    }
    .sheet(isPresented: $showSetting) {
        SettingsView(showSetting: self.$showSetting)
    }
}
}
ContentView结构的。如果我对行进行注释,错误将消失

@State private var result: NSFetchRequestResult
在几年内,结构,但它显然会导致另一个错误。所以我迷路了。请问这里的推荐做法是什么?
谢谢。

多亏了这篇文章,我终于找到了路

struct Years:视图{
var请求:FetchRequest
var结果:FetchedResults{
request.wrappedValue
}
@国家私有变量selectedDataRow:数据?
init(cntryName:String){
self.request=FetchRequest(实体:Data.entity(),
sortDescriptors:[NSSortDescriptor(键路径:\Data.dataYear,升序:true)],
谓词:NSPredicate(格式:“dataCountry==%@”,cntryName),动画:。默认值)
}
var body:一些观点{
VStack{
选择器(“年”,选择:$selectedDataRow){
ForEach(result,id:\.self){dataRow in
文本(dataRow.dataYear???“不适用”).tag(dataRow作为数据?)
}
}
.pickerStyle(WheelPickerStyle())
.frame(宽度:CGFloat(UIScreen.main.bounds.width),高度:CGFloat(100))
.clipped()
VStack(对齐:。前导,间距:10){
HStack{
案文(“全面辩论:”)
.alignmentGuide(.leading){中的维度
10
}
如果选择数据行!=nil{
文本(字符串(描述:selectedDataRow!.dataTotalPopulation))
}否则{
正文(“不适用”)
}
}
}}
}
}
Years(cntryName: selectedCountry?.cntryName! ?? "")
@State private var result: NSFetchRequestResult
struct Years: View {

var request: FetchRequest<Data>
var result: FetchedResults<Data> {
    request.wrappedValue
}

@State private var selectedDataRow: Data?

init(cntryName: String) {
    self.request = FetchRequest(entity: Data.entity(),
                           sortDescriptors: [NSSortDescriptor(keyPath: \Data.dataYear, ascending: true)],
                           predicate: NSPredicate(format: "dataCountry == %@", cntryName), animation: .default)
}

var body: some View {
    VStack {
        Picker("Year", selection: $selectedDataRow) {
            ForEach(result, id: \.self) { dataRow in
                Text(dataRow.dataYear ?? "N/A").tag(dataRow as Data?)
            }
        }
        .pickerStyle(WheelPickerStyle())
        .frame(width: CGFloat(UIScreen.main.bounds.width), height: CGFloat(100))
        .clipped()
        VStack(alignment: .leading, spacing: 10) {
        HStack {
            Text("Total polutation: ")
                .alignmentGuide(.leading) { dimension in
                    10
            }
            if selectedDataRow != nil {
                Text(String(describing: selectedDataRow!.dataTotalPopulation))
            } else {
                Text("N/A")
            }
        }
        }}
}
}