繁体   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