dav*_*dev 1 xcode view swift swiftui
我在我的视图中存储一个 Int 值作为状态。当我按下按钮时,Int 增加一。当我打印 int 值时,这工作正常。
我现在有一个 ForEach 循环,它基于这个 Int 进行迭代。默认情况下,当我将 State 设置为 2 时,它在开始时工作正常。但是,当我增加 Int 时,不会再次调用我的 ForEach。
我知道 State 会重新加载我的实际视图。它是否只加载特定的部分?
我在这里声明我的状态:
@State var s_countVenues : Int = 2
Run Code Online (Sandbox Code Playgroud)
这是我使用的 ForEach。它在开始时有效,但是更改s_countVenues
不会更新视图。
ForEach(0..<self.s_countVenues)
{_ in
HStack(spacing: 0)
{
//here comes my view
}
}
Run Code Online (Sandbox Code Playgroud)
如有必要,我在这里将我的价值加一。它有效,我打印了更改,如果我在 Label 中使用它,则 Label 会更新。
self.s_countVenues += 1
Run Code Online (Sandbox Code Playgroud)
电话:DR:
我的 Int 状态正在工作。能增加,在标签里面打印。但是,在 ForEach 中将其用作 Statement 不会在更改后再次调用该循环。
我已经用 ', id: .self' 将其静音
来自苹果文档
extension ForEach where Data == Range<Int>, ID == Int, Content : View {
/// Creates an instance that computes views on demand over a *constant*
/// range.
///
/// This instance only reads the initial value of `data` and so it does not
/// need to identify views across updates.
///
/// To compute views on demand over a dynamic range use
/// `ForEach(_:id:content:)`.
public init(_ data: Range<Int>, @ViewBuilder content: @escaping (Int) -> Content)
}
Run Code Online (Sandbox Code Playgroud)
因此,您必须使用(如 Apple 建议的那样)
struct ContentView: View {
@State var counter = 0
var body: some View {
VStack {
ForEach(0 ..< counter, id:\.self) { i in
Text("row: \(i.description)")
}
Button(action: {
self.counter += 1
}, label: {
Text("counter \(counter.description)")
})
}
}
}
Run Code Online (Sandbox Code Playgroud)
这不是由于状态,而是因为您使用ForEach
带有常量的构造函数Range
,它是记录功能,所以不应该更新,所以它不会更新。最简单的解决方案如下 - 使用加入到您的状态的标识符。它只是表明渲染引擎 ForEach 是新的,因此请刷新(使用 Xcode 11.2 / iOS 13.2 测试)
ForEach(0..<self.s_countVenues)
{_ in
HStack(spacing: 0)
{
//here comes my view
}
}.id(s_countVenues)
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
1742 次 |
最近记录: |