数组大小更改后如何刷新ForEach显示元素的数量(SwiftUI,Xcode 11 Beta 5)

Ngu*_*Hào 4 xcode swift swiftui xcode11

我试图实现一个视图,如果内容数组的大小发生变化,该视图可以更改显示项的数量(由ForEach循环创建),就像购物应用程序在用户拉动刷新后如何更改其可用项数一样

这是到目前为止我尝试过的一些代码。如果我没记错的话,这些可以使用Xcode beta 4,但是可以使用beta 5:

  • 如果数组的大小增加,则循环仍将显示元素的原始数量
  • 数组的大小减小将导致索引超出范围错误

码:

import SwiftUI

struct test : View {
    @State var array:[String] = []
    @State var label = "not pressed"
    var body: some View {
        VStack{
            Text(label).onTapGesture {
                self.array.append("ForEach refreshed")
                self.label = "pressed"
            }
            ForEach(0..<array.count){number in
                Text(self.array[number])
            }
        }
}
}

#if DEBUG
struct test_Previews: PreviewProvider {
    static var previews: some View {
        test()
    }
}
#endif
Run Code Online (Sandbox Code Playgroud)

我通常是SwiftUI和GUI编程的新手,只是感觉每个内容都是在启动时定义的,因此之后真的很难进行更改(例如:在用户导航离开并返回视图后重置视图)。对于循环问题的解决方案或使视图更具动态性的任何提示将不胜感激!

kon*_*iki 5

Beta 5发行说明说:

Int与可识别协议的追溯一致性已删除。更改所有依赖此一致性的代码,以将.self传递给相关初始化程序的id参数。不断接受Int的恒定范围:

List(0..<5) {
   Text("Rooms")
}
Run Code Online (Sandbox Code Playgroud)

但是,您不应传递在运行时更改的范围。如果使用在运行时更改的变量来定义范围,则列表将根据初始范围显示视图,并忽略对该范围的任何后续更新。

您应该更改ForEach为接收数组,而不是范围。最好是一个Identifiable数组,以避免使用\.self。但是根据您的目标,这仍然可以工作:

import SwiftUI

struct ContentView : View {
    @State var array:[String] = []
    @State var label = "not pressed"
    var body: some View {
        VStack{
            Text(label).onTapGesture {
                self.array.append("ForEach refreshed")
                self.label = "pressed"
            }
            ForEach(array, id: \.self) { item in
                Text(item)
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

或者如rob mayoff建议的那样,如果您需要索引:

struct ContentView : View {
    @State var array:[String] = []
    @State var label = "not pressed"
    var body: some View {
        VStack{
            Text(label).onTapGesture {
                self.array.append("ForEach refreshed")
                self.label = "pressed"
            }
            ForEach(array.indices, id: \.self) { index in
                Text(self.array[index])
            }
        }
    }
}```
Run Code Online (Sandbox Code Playgroud)

  • 或者如果您需要数组索引,请使用“ForEach(array.indices, id: \.self)”。 (2认同)