Swift 为什么@State值没有更新

Swift 为什么@State值没有更新,swift,swiftui,Swift,Swiftui,我有三个按钮,每个按钮对应于数据数组中的一个值。当用户单击按钮时,相应的值将显示在图纸窗口中。这是我的密码: struct TestView: View { @State var data: [Int] = [100, 200, 300] @State var presented: Bool = false @State var index4edit: Int = 1 var body: some View { HStack{

我有三个按钮,每个按钮对应于数据数组中的一个值。当用户单击按钮时,相应的值将显示在图纸窗口中。这是我的密码:

struct TestView: View {
    @State var data: [Int] = [100, 200, 300]
    @State var presented: Bool = false
    @State var index4edit: Int = 1
    
    var body: some View {
        HStack{
            ForEach(1..<4){ index in
                Button(action: {
                    index4edit = index
                    presented.toggle()
                }){ Text(String(index)) }
                .frame(width: 30, height: 30)
                .padding()
            }
        }
        .sheet(isPresented: $presented, content: {
            Text("\(index4edit): \(data[index4edit-1])")
        })
    }
}
struct TestView:View{
@状态变量数据:[Int]=[100200300]
@显示的状态变量:Bool=false
@状态变量index4edit:Int=1
var body:一些观点{
HStack{

ForEach(1..您应该将
index4edit
设置为真正的(基于0的)索引,而不是索引+1。您还应该在
ForEach
中使用
数据.索引
,而不是手动输入范围

struct TestView: View {
    @State private var data: [Int] = [100, 200, 300]
    @State private var presented: Bool = false
    @State private var index4edit: Int = 0
    
    var body: some View {
        HStack {
            ForEach(data.indices) { index in
                Button(action: {
                    index4edit = index
                    presented.toggle()
                }){ Text(String(index)) }
                .frame(width: 30, height: 30)
                .padding()
            }
        }
        .sheet(isPresented: $presented, content: {
            Text("\(index4edit): \(data[index4edit])")
        })
    }
}

struct TestView_Previews: PreviewProvider {
    static var previews: some View {
        TestView()
    }
}

这是因为图纸视图是在视图初始化时创建的。当您更改状态时,不会重新创建视图,因为您的状态变量未在视图中使用

要解决这个问题,只需在代码中的某个地方使用State变量,就像这个虚拟示例一样

HStack{
    ForEach(1..<4){ index in
        Button(action: {
            index4edit = index
            presented.toggle()
        }){ Text(String(index) + (index4edit == 0 ? "" : "")) } //<<here is the State used
        .frame(width: 30, height: 30)
        .padding()
    }
}
HStack{

弗雷奇(1..感谢回复,但不起作用,仍然
100
始终。@Mandroid您如何创建
TestView
?我在预览中测试过,它的工作原理与swiftui应用程序项目中的charm.Xcode 12类似。@Mandroid我的意思是您实际使用的代码是什么。如果您使用我的答案中的代码,它会起作用,因此肯定存在另一个问题您的代码。只需复制/粘贴您的代码。此问题仅在运行后第一次单击按钮时发生。谢谢。为了避免在某些地方使用它,我将其作为静态变量。