SwiftUI,列表视图中项目的唯一步进器

SwiftUI,列表视图中项目的唯一步进器,swiftui,Swiftui,我想显示从NSManagedObject获取的数组列表。 然后,在该列表中,每个项目都有一个步进器,该步进器最终将与NSManagedObject属性的增量相同 到目前为止,我的代码是: struct ExtraIncomeAdviceView: View { var incomes:FetchedResults<Income> var savingsGoals:FetchedResults<SavingsGoal> var presentati

我想显示从NSManagedObject获取的数组列表。 然后,在该列表中,每个项目都有一个步进器,该步进器最终将与NSManagedObject属性的增量相同

到目前为止,我的代码是:

struct ExtraIncomeAdviceView: View {

    var incomes:FetchedResults<Income>
    var savingsGoals:FetchedResults<SavingsGoal>
    var presentationModeAddIncomeView: Binding<PresentationMode>
    @Environment(\.presentationMode) var presentationModeAdvice: Binding<PresentationMode>
    @State private var increment:Int = 0

    var body: some View {
        VStack{

            Text("So you got an extra £\(String(format: "%0.2f",getLatestExtraIncome()))?").font(.headline)
            VStack{
                HStack{
                    Text("For your goals, set aside:").font(.footnote).foregroundColor(.gray)
                    Spacer()
                }
                ForEach(self.savingsGoals) { goal in

                    HStack{
                        Spacer()
                        Stepper("Add to \(goal.name!): \(goal.progressAmount!)", onIncrement: {
                            self.increment += 1
                            print("Adding to age")
                        }, onDecrement: {
                            self.increment -= 1
                            print("Subtracting from age")
                        })

                    }

                }

            }.padding()
                .padding(.vertical, 40)
            Button(action:  {


                self.presentationModeAdvice.wrappedValue.dismiss()
                self.presentationModeAddIncomeView.wrappedValue.dismiss()
            }) {
                Text("Got it!")
                    .foregroundColor(.white)

                    .padding(15)
                    .background(Color .orange)
                    .cornerRadius(40)
            }

        }.padding()
    }
}
struct extracomeadvice视图:视图{
var收益:获取的结果
var savingsGoals:获取的结果
var presentationModeAddIncomeView:绑定
@环境(\.presentationMode)变量PresentationModelAdvice:绑定
@国家私有变量增量:Int=0
var body:一些观点{
VStack{
文本(“因此您得到了一个额外的\(字符串(格式:“%0.2f”,getLatestExtraIncome()))?”。字体(.headline)
VStack{
HStack{
文本(“对于您的目标,请放在一边:”).font(.footnote).foregroundColor(.gray)
垫片()
}
ForEach(自我拯救目标){
HStack{
垫片()
Stepper(“添加到\(goal.name!):\(goal.progressAmount!)”,onIncrement:{
自增量+=1
打印(“添加到年龄”)
},onDecrement:{
自增量-=1
打印(“从年龄中减去”)
})
}
}
}.padding()
.padding(.vertical,40)
按钮(操作:{
self.presentationModeAdvice.wrappedValue.discouse()文件
self.presentationModeAddIncomeView.wrappedValue.discouse()文件
}) {
文本(“明白了!”)
.foregroundColor(.白色)
.填充(15)
.背景(颜色.橙色)
.转弯半径(40)
}
}.padding()
}
}

问题是ForEach中显示的每个目标都读取和写入同一个变量。我一直在研究如何动态地为数组中的每个项目创建新的变量以进行读写。

在您的情况下,我将创建一个自定义视图结构,该结构在名为
GoalRow()
ForEach
中调用,或者是包含HStack、Stepper和局部增量变量的适用对象。然后,您可以在
GoalRow()
struct中适当地处理阶跃值,并稍微清理代码

ForEach(self.savingsGoals) { goal in
    GoalRow(goal: goal)
}
然后在
GoalRow
内:

struct GoalRow: View {

    var goal: YourObject
    @State private var increment: Int = 0

    var body: some View {

            HStack(alignment: .leading, spacing: 20) {

                Stepper("Add to \(goal.name!): \(goal.progressAmount!)", onIncrement: {
                    self.increment += 1
                    // edit your proposed progress amount here
                    print("Adding to age")
                }, onDecrement: {
                    self.increment -= 1
                    // edit your proposed progress amount here
                    print("Subtracting from age")
                })
            }

苹果在他们的教程中提到了这一点。请参阅本教程中的
LandmarkRow
示例

我不明白……您有什么问题?你有错误吗?为什么不允许您在s'Stepper->中增加ManagedObject?Stepper不是在您显示列表时执行,而是在用户点击Stepper时执行,然后列表将被更新,这是正常的。。。