了解核心数据,在 SwiftUI 中的视图之间传递数据
Understanding Core Data, passing data between views in SwiftUI
我正在尝试使用 CoreData 和 SwiftUI 创建一个小项目
我创建了 2 个简单实体,一个名为 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")
}))
}
}
}
在 addview 上我将数据添加到机场实体
import SwiftUI
struct AddView: View {
@State var aptICAO : String = ""
@Environment(\.presentationMode) var presentation
@Environment(\.managedObjectContext) var dbContext
var body: some View {
VStack{
TextField("ICAO", text: self.$aptICAO)
.textFieldStyle(RoundedBorderTextFieldStyle())
Button(action: {
let newAirport = Airport(context: self.dbContext)
newAirport.icaoAPT = self.aptICAO
do {
try self.dbContext.save()
self.presentation.wrappedValue.dismiss()
} catch {
print("errore nel salva")
}
}) {
Text("Save")
}
}.padding()
}
}
在 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")
}))
}
}
这是我的 AddNote 视图:
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()
}
}
我总是看到我为每个机场添加的注释相同,但每个机场应该有所不同。
感谢帮助
如果您希望每个机场都有很多注释,我建议更改您的数据模型,使其接受两者之间的 'one to many' 关系。
回答主要问题;为了能够过滤,您需要根据您 select 所在的机场过滤结果。 article 很好地解释了这一点,并使用 NSPredicate 进行了更详细的介绍。
我正在尝试使用 CoreData 和 SwiftUI 创建一个小项目
我创建了 2 个简单实体,一个名为 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")
}))
}
}
}
在 addview 上我将数据添加到机场实体
import SwiftUI
struct AddView: View {
@State var aptICAO : String = ""
@Environment(\.presentationMode) var presentation
@Environment(\.managedObjectContext) var dbContext
var body: some View {
VStack{
TextField("ICAO", text: self.$aptICAO)
.textFieldStyle(RoundedBorderTextFieldStyle())
Button(action: {
let newAirport = Airport(context: self.dbContext)
newAirport.icaoAPT = self.aptICAO
do {
try self.dbContext.save()
self.presentation.wrappedValue.dismiss()
} catch {
print("errore nel salva")
}
}) {
Text("Save")
}
}.padding()
}
}
在 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")
}))
}
}
这是我的 AddNote 视图:
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()
}
}
我总是看到我为每个机场添加的注释相同,但每个机场应该有所不同。
感谢帮助
如果您希望每个机场都有很多注释,我建议更改您的数据模型,使其接受两者之间的 'one to many' 关系。
回答主要问题;为了能够过滤,您需要根据您 select 所在的机场过滤结果。 article 很好地解释了这一点,并使用 NSPredicate 进行了更详细的介绍。