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
我知道这是一个简单的问题,但我还没有找到答案。我想了解基本概念。
我正在尝试更新具有非常量范围的 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