[英]Only change one item in List using ForEach SwiftUI Core Data
我有一个循环视图,使用 ForEeach 使用核心数据关系显示数组中的列表。
视图显示每个循环中的所有元素,我需要将它们单独分割出来,同时能够继续切换按钮,而不是同时切换所有目标。
编辑:我想出了如何制作它,所以它们都没有迭代和显示,但现在切换任何按钮都会切换它们。 :(
游戏目标详情
import SwiftUI
import CoreData
struct GameGoalsDetail: View {
@Environment(\.managedObjectContext) var moc
@FetchRequest(entity: Game.entity(), sortDescriptors: []) var games: FetchedResults<Game>
@State private var showingAddGoal = false
@State private var goalComplete : Bool = false
@ObservedObject var game: Game
var body: some View {
VStack {
Text(self.game.gameName ?? "No Game Name").font(.title)
Text(self.game.gameDescription ?? "No Game Description").font(.subheadline)
List {GameGoalListView(game: self.game).environment(\.managedObjectContext, self.moc)
}
Button("Add Game Goal") {
self.showingAddGoal.toggle()
}
.sheet(isPresented: $showingAddGoal) {
AddGameGoalsView(game: self.game).environment(\.managedObjectContext, self.moc)
}
}
}
}
游戏目标列表视图
import SwiftUI
import CoreData
struct GameGoalListView: View {
@Environment(\.managedObjectContext) var moc
@FetchRequest(entity: Game.entity(), sortDescriptors: []) var games: FetchedResults<Game>
@ObservedObject var game: Game
@State private var goalComplete : Bool = false
var body: some View {
VStack {
ForEach(game.goalArray, id: \.self) { goal in
HStack {
Text(goal.goalName ?? "No Goal Name")
Spacer()
Text("Complete:").font(.caption)
Image(systemName: self.goalComplete ? "checkmark.square.fill" : "app").onTapGesture {
self.goalComplete.toggle()
print(self.goalComplete)
}
}
}
}
}
}
我试图让它在添加目标时显示在列表中,然后我可以通过按钮选择目标是否完成。 所以每个游戏都会有一个由用户输入添加的不同目标的列表。
非常感谢您的帮助,并可以根据要求提供更多信息。
我不得不重做这么多,但在一位出色的 Redditor 的帮助下,我弄明白了。
比赛进球详情
List {
ForEach(game.goalArray, id: \.self) { goal in
GameGoalListView(goal: goal)
}
}
只需要传入的 GameGoalListView(goal:goal) 因为我重做了 GameGoalListView。
游戏目标列表视图
@ObservedObject 是目标而不是游戏。 onTapGesture 是从 CoreData 而不是 State(它创建了一个新的真理来源(观看 WDCC 视频))访问了goal.goalComplete。
然后 onReceive 和 objectWillChange 让目标知道每次点击按钮时它都会改变。
struct GameGoalListView: View {
@Environment(\.managedObjectContext) var moc
@ObservedObject var goal: Goal
var body: some View {
VStack {
HStack {
Text(goal.goalName ?? "No Goal Name")
Spacer()
Text("Complete:").font(.caption)
Image(systemName: self.goal.goalComplete ? "checkmark.square.fill" : "app").onTapGesture {
self.goal.goalComplete.toggle()
print(self.goal.goalComplete)
}
}
}
.onReceive(self.goal.objectWillChange) {
try? self.moc.save()
}
}
}
正如我所说,帮助来自 Redditor,我希望这有助于有人弄清楚我搞砸了什么并修复他们的错误。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.