SwiftUI-带有切换Bool变量的按钮的数组列表

时间:2020-04-17 19:58:56

标签: swift xcode swiftui

我正在尝试创建一个简单的代码:我有一个包含三个对象的“数组”,每个对象都包含一个布尔值。我想创建一个为每个对象创建一个按钮的列表,当我单击该按钮时,对象的值就会切换。我尝试过,但收到错误消息:“无法分配给属性:'n'是'let'常量”。 您对我有什么建议或简单的代码吗?

import SwiftUI

struct Object {
   var id = UUID()
   var selected : Bool
}

struct ContentView: View {

   var array = [Object( selected: false), Object(selected: false), Object(selected: false)]

   var body: some View {

       ForEach(array, id: (\.id)) { n in
           VStack {
               Button( action: { n.selected = true }) { Text("Change")}
           }
       }
   }
}

1 个答案:

答案 0 :(得分:0)

您不能更改在块中传递的变量,因为它是不可变的。这只是列表元素的副本,而不是实际的列表元素。

一种可行的替代实现方式是:

import SwiftUI

struct Object {
    var id = UUID()
    var selected: Bool
}

struct ContentView: View {
    @State var array = [Object(selected: false), Object(selected: false), Object(selected: false)]

    var body: some View {
        ForEach(array.indices) { index in
            VStack {
                Button(action: { self.array[index].selected = true }) {
                    Text("Change: \(self.array[index].selected.description)")
                }
            }
        }
    }
}

我添加了@State装饰器,它是您进行数组更改所必需的,可以刷新视图,并且我还更改了获取值的方式,直接从数组获取而不是获取它来自参数。