[英]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.