首页 > 解决方案 > 将对象传递给另一个视图并在 SwiftUI 中更改其值

问题描述

我对以下任务有疑问。我有一个由 Activity 创建的结构和一个由 Activity 对象组成的类。

struct Activity: Identifiable, Codable {
    var id = UUID()
    let name: String
    let description: String
    var amount: Int
}

class Activities: ObservableObject {
    @Published var activities = [Activity]() {
}

在我的主视图中,我有一个这些活动的列表,使用 NavigationLink 我们可以转到每个活动并查看描述和我们执行的次数。

struct ContentView: View {
    @ObservedObject var activities = Activities()
    
    var body: some View {
        NavigationView {
            List {
                ForEach(activities.activities, content: { activity in
                    NavigationLink(
                        destination: ActivityView(activity: activity),
                        label: {
                            VStack(alignment: .leading) {
                                Text(activity.name)
                                    .font(.headline)
                                Text("\(activity.amount)")
                            }
                        })
                })
            }
        }
    }
}

我的问题是,在这个详细视图中,我希望能够增加我们执行活动的次数,但我收到一个错误:变异运算符的左侧不可变:“自我”是不可变的

struct ActivityView: View {
    var activity: Activity
    
    var body: some View {
        Text(activity.name)
        Text(activity.description)
        Text("\(activity.amount)")
        Button(action: {
            print(activity.amount)
            self.activity.amount += 1
        }, label: {
            Text("Button")
        })
    }
}

谁能帮我这个?

标签: viewswiftuiparameter-passingimmutability

解决方案


您可以为此使用绑定

struct ActivityView: View {
    @Binding var activity: Activity
...

并更新父级以传递绑定值

    ForEach(Array(activities.activities.enumerated()), id: \.1, content: { i, activity in
        NavigationLink(
            destination: ActivityView(activity: self.$activities[i]),

推荐阅读