更改State变量后,为什么我的快速ui视图没有更新?

时间:2020-08-22 01:23:28

标签: swiftui

我是Swift开发的新手,我正在尝试制作一个View,您可以在其中单击一个项目,该项目变大,而旧的大项目变小。我正在使用一个@State var来选择,以了解当前哪个Element应该很大。这些项目本身是顶部带有按钮的视图。想法是,我单击按钮,然后按钮将更改选定的变量,该变量正在起作用。但似乎我的观点并没有重绘,一切依旧。简化的伪代码如下所示:

struct MyView: View {
    @State var chosen = 0
    
    var body: some View {
        VStack(){
            ForEach(0 ..< 4) { number in
                if self.chosen == number {
                        DifferentView()
                            .frame(big)
                            .clipShape(big)
                }else{
                    ZStack{
                        DifferentView()
                            .frame(small)
                            .clipShape(small)
                        Button(action: {self.chosen = number}){Rectangle()}
                    }
                }
            }
        }
    }

1 个答案:

答案 0 :(得分:3)

您正在使用ForEach.init(_:content:)的此重载,它接受一个恒定范围。尽管您的范围没有变化,但似乎还ForEach这个变体没有更新内容(这对我来说很令人惊讶)。

您需要使用以下重载:ForEach.init(_:id:content:)-为id提供密钥路径:

ForEach(0 ..< 4, id: \.self) { number in
  // ...
}

但是因为有条件,它使SwiftUI崩溃(很难知道为什么)。避免出现这种情况的方法是将其包装在GroupZStack之类的东西中,或者甚至是生成内部视图的函数:

ForEach(0 ..< 4, id: \.self) { number in
  Group {
    self.chosen == number {
       // ...
    } else {
       // ...
    }
  }
}

或者,像这样:

ForEach(0 ..< 4, id: \.self) { number in
   self.inner(for: number)
}
@ViewBuilder
func inner(for number: Int) -> some View {
  self.chosen == number {
     // ...
  } else {
     // ...
  }
}