簡體   English   中英

僅使用 ForEach SwiftUI Core Data 更改 List 中的一項

[英]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 的幫助下,我弄明白了。

比賽進球詳情

  • 我不需要 Fetch 請求,因為它是從視圖中傳入的。
  • 不需要 @State 因為我應該直接使用 CoreData 信息。
List {
    ForEach(game.goalArray, id: \.self) { goal in
        GameGoalListView(goal: goal)
    }
}

只需要傳入的 GameGoalListView(goal:goal) 因為我重做了 GameGoalListView。

游戲目標列表視圖

  • 再次擺脫了@State 和 @FetchRequest
  • GameGoalsDetail 中的列表顯示了每個目標,因此在此視圖中不需要額外的 ForEach。 這個視圖只需要顯示需要顯示的東西和從 CoreData 中提取的信息。

@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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM