I have a form that will save info to core data, I then fetch that data and pass it to a product card that will be put into a list of product cards with different data.. when I click into the product card to go into the details of the card, the data is incorrect when viewed. Instead of it saying name2 it says name1 I would need the product detail to include the data that was displayed on the product card from the home view. I am trying to achieve this with Core Data.
Core Data will have title and subTitle as Strings
name, title, subTitle will be logged into the @NSManaged public var I'm using
Product cards details by a form from another view
// this struct will be on the home screen
struct productCard: View {
@Environment (\.managedObjectContext) var managedObjContext
@FetchRequest(entity: DataSet.entity(), sortDescriptors: [NSSortDescriptor(keyPath: \DataSet.name, ascending: true)])
var dataSet: FetchedResults <DataSet>
var body: some View {
ScrollView {
HStack {
ForEach( self.dataSet, id: \.self){ DataSet in
NavigationLink {
productCardDetails(dataSet: _dataSet)
} label: {
HStack{
Text(DataSet.self.title ?? "Error")
.font(.title3)
.fontWeight(.bold)
.foregroundColor(.red)
Spacer()
Text(DataSet.self.subTitle ?? "Error")
.font(.caption)
.foregroundColor(.red)
}.padding(.horizontal, 10)
}
}
}
}
}
}
The product card will take the user into the productCardDetails
struct productCardDetails: View {
@Environment (\.managedObjectContext) var managedObjContext
@FetchRequest(sortDescriptors: []) var dataSet: FetchedResults <DataSet>
var body: some View {
ZStack(alignment: .bottom) {
NavigationView {
Form{
List(dataSet[0..<1], id:\.self) { DataSet in
Section{
Text(DataSet.self.title ?? "error")
.font(.title2)
.fontWeight(.bold)
Text(DataSet.self.subTitle ?? "error")
.font(.subheadline)
.fontWeight(.light)
.multilineTextAlignment(.leading)
}
}
}
}
}
}
}
For an example to demonstrates what happens is, when I have created 5 cards from the form I have, on the home screen it will show 5 productCard's, so it will be on the home view as productCard1, productCard2, productCard3, productCard4, productCard5 and in those cards they will all have their unique titles and subTitles. But for example when I click onto productCard4 it will display productCard1
CodePudding user response:
Well, you are using a collection in your productCardDetails View and in it only using the first entry. Better pass on that DataSet you want to show.
struct ProductCard: View {
@Environment (\.managedObjectContext) var managedObjContext
@FetchRequest(entity: DataSet.entity(), sortDescriptors: [NSSortDescriptor(keyPath: \DataSet.name, ascending: true)])
var dataSets: FetchedResults <DataSet>
var body: some View {
ScrollView{
HStack{
ForEach( self.dataSets, id: \.self){ dataSet in
NavigationLink {
ProductCardDetails(dataSet: dataSet)
} label: { HStack{
Text(dataSet.title ?? "Error")
.font(.title3)
.fontWeight(.bold)
.foregroundColor(.red)
Spacer()
Text(dataSet.subTitle ?? "Error")
.font(.caption)
.foregroundColor(.red)
}.padding(.horizontal, 10)}}}}}}}
and in the detail view:
struct ProductCardDetails: View {
@Environment (\.managedObjectContext) var managedObjContext
var dataSet: DataSet
var body: some View {
ZStack(alignment: .bottom){
NavigationView {
Form{
Section{ Text(dataSet.title ?? "error")
.font(.title2)
.fontWeight(.bold)
Text(dataSet.subTitle ?? "error")
.font(.subheadline)
.fontWeight(.light)
.multilineTextAlignment(.leading)}}}}}}
You really need to start using default naming conventions.
- lowersize for variable names
- uppersize for type names
- pluralize collections
