Swift 具有非恒定范围的 ForEach 视图刷新

Swift ForEach with non constant range View Refresh

我知道这是一个简单的问题,但我还没有找到答案。我想了解基本概念。

我正在尝试更新具有非常量范围的 ForEach,关闭参数是分配给按钮的变量。

该变量分配有 @State,因此它应该刷新视图。不知何故它不起作用。



import SwiftUI

struct ContentView: View {
    @State private var numberOfTimes = 5
    let timesPicker = [2,5,10,12,20]
    @State private var tableToPractice = 2
    enum answerState {
        case unanswered
        case wrong
        case right
    }
    func listRange(){
        
    }
    
    var body: some View {
        NavigationView{
            HStack{
                VStack{
                    Form{
                        Section {
                            Picker("Tip percentage", selection: $numberOfTimes) {
                                ForEach(timesPicker, id: \.self) {
                                    Text([=11=], format: .number)
                                }
                            }
                            .pickerStyle(.segmented)
                        } header: {
                            Text("How many times do you want to practice?")
                        }
                        Section{
                            Stepper("Table to practice: \(tableToPractice.formatted())", value: $tableToPractice, in: 2...16 )
                        }
                            Button("Start Now", action: listRange).buttonStyle(.bordered)
                        

                        
                        List{
                            ForEach(0..<numberOfTimes){
                                Text("Dynamic row \([=11=])")
                            }
                        }
                    }.foregroundColor(.gray)
                }
            }
        }
    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}

问题是没有识别范围。让我们做一些行

    struct Row: Identifiable {
        let id = UUID()
    }

然后设置一个可识别项数组

    @State private var numberOfTimes = 5
    @State private var rows = Array(repeating: Row(), count: 5)

现在您可以拥有响应列表

    List{
        ForEach(rows) { row in
            Text("Dynamic row")
        }
    }

调用更改更新以重新创建数组

    .onChange(of: numberOfTimes) { newValue in
        rows = Array(repeating: Row(), count: newValue)
        numberOfTimes = newValue
    }

应该在表单上调用 onChange。

当您拥有更好的视图模型数据时,这将更有意义,请参阅苹果文档以获取更深入的示例。

这是针对惰性 v 堆栈的,但数据模型设置是我正在考虑的

https://developer.apple.com/documentation/swiftui/grouping-data-with-lazy-stack-views