我是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()}
}
}
}
}
}
答案 0 :(得分:3)
您正在使用ForEach.init(_:content:)
的此重载,它接受一个恒定范围。尽管您的范围没有变化,但似乎还ForEach
这个变体没有更新内容(这对我来说很令人惊讶)。
您需要使用以下重载:ForEach.init(_:id:content:)
-为id
提供密钥路径:
ForEach(0 ..< 4, id: \.self) { number in
// ...
}
但是因为有条件,它使SwiftUI崩溃(很难知道为什么)。避免出现这种情况的方法是将其包装在Group
或ZStack
之类的东西中,或者甚至是生成内部视图的函数:
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 {
// ...
}
}