基于 State int 的 SwiftUI ForEach

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 不会在更改后再次调用该循环。

Zer*_*Lld 8

我已经用 ', id: .self' 将其静音

  • 通过额外的支持信息可以改进您的答案。请[编辑]添加更多详细信息,例如引文或文档,以便其他人可以确认您的答案是正确的。您可以[在帮助中心](/help/how-to-answer)找到有关如何写出好的答案的更多信息。 (2认同)

use*_*734 7

来自苹果文档

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)

  • 简而言之:使用 `id: \.self`。 (6认同)

Asp*_*eri 7

这不是由于状态,而是因为您使用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)