我正在尝试在HStack和VStack中使用forEach。我在它们中使用文本,运行时文本不会出现,但onAppear打印值。请看一下我的代码。为什么文本不显示?我怎么才能让它工作呢?
@State var sd = ["1","2","3","4","5","6","7"]
VStack {
ForEach(0...sd.count/3) { _ in
HStack {
ForEach(0...2) { _ in
if(self.sd.isEmpty) {
} else {
Text("Test")
.onAppear() {
if(!self.sd.isEmpty) {
print("i appeared")
self.sd.removeFirst()
}
}
}
}
Spacer()
}
}
}
我在这里想要实现什么?
我正在尝试创建一个最多3个文本在它的HStacks。我在这里只使用数组来渲染文本7次。
具有7个元素的数组的预期结果->
我想创建一个3 HStacks的VStack,在第一个2 HStacks我想渲染文本3次,在最后的HStack我只想要一个文本。(比如我有7个数组元素,这就是为什么前两个hstack中有3个文本,最后一个hstack中有一个文本)。如果数组有10个元素,那么3个Hstack包含3个文本,last Stack包含1个文本。我无法呈现文本,因为我的数组是@state var,每次我从其中删除firstElement时,它都会刷新view.body。
有没有办法实现这个行为,我正在尝试通过只使用SwiftUI来实现。我不想使用UICollection视图。
发布于 2019-07-15 08:53:45
您通常不希望更改@State变量作为body
求值的副作用;在这种情况下,self.sd.removeFirst()
会导致body
被标记为需要重新求值,因此SwiftUI
会一直调用它,直到您的sd
数组为空,这就是为什么您看不到任何呈现的原因。
要获得你想要的效果,这是一种你可以做到的方法:
import SwiftUI
struct ContentView : View {
@State private var sd = ["1","2","3","4","5","6","7"]
private let columns = 3
var body: some View {
VStack {
ForEach(Array(stride(from: 0, to: sd.count, by: columns))) { row in
HStack {
ForEach(0..<self.columns) { col in
if row + col < self.sd.count {
Text("\(self.sd[row + col])")
}
}
}
}
}
}
}
附注:大多数在body
评估中修改状态的尝试似乎都会导致运行时警告Modifying state during view update, this will cause undefined behavior.
-似乎您的数组突变以某种方式绕过了这一检查,但希望这种事情将在未来的运行时被调用。
https://stackoverflow.com/questions/57032007
复制相似问题