SwiftUI 动态 add/remove TextField with Stepper
SwiftUI dynamically add/remove TextField with Stepper
大家好,我是 SwiftUI 的新手,我正在尝试找到一种巧妙的方法来在按下陡峭的加号或减号时添加或删除 TextFields。
我目前有
@State private var answers: [String] = ["", ""]
Stepper(onIncrement: {
if(numberOfAnswers < 10){
answers.append("")
numberOfAnswers += 1
}
},
onDecrement: {
if(numberOfAnswers > 2){
answers.removeLast()
numberOfAnswers -= 1
}
}) {
ForEach(answers.indices, id: \.self) { index in
TextField("Answer", text: $answers[index])
}
然而,当调用 onDecrement 时,这会导致 Index out of bounds 异常。
我尝试使用 ForEach(answers)
包装字符串以符合 Identifiable(在结构声明中使用 @State
),但是这会产生一条警告,指出该变量不会被更新。
我已尝试发布 here 的解决方案,但无济于事。
我不需要永久存储这个结果,因为它将传递给一个单独的函数,在按下按钮时进行 API 调用。
如有任何帮助,我们将不胜感激。
这里是固定的复制代码。使用 Xcode 11.4 / iOS 13.4
测试
struct DemoView: View {
@State var numberOfAnswers = 2
@State private var answers: [String] = ["", ""]
var body: some View {
Stepper(onIncrement: {
if(self.numberOfAnswers < 10){
self.answers.append("")
self.numberOfAnswers += 1
}
},
onDecrement: {
if(self.numberOfAnswers > 2){
self.answers.removeLast()
self.numberOfAnswers -= 1
}
}) {
ForEach(Array(answers.enumerated()), id: \.0) { i, _ in
TextField("Answer", text: self.$answers[i])
}
}
}
}
大家好,我是 SwiftUI 的新手,我正在尝试找到一种巧妙的方法来在按下陡峭的加号或减号时添加或删除 TextFields。
我目前有
@State private var answers: [String] = ["", ""]
Stepper(onIncrement: {
if(numberOfAnswers < 10){
answers.append("")
numberOfAnswers += 1
}
},
onDecrement: {
if(numberOfAnswers > 2){
answers.removeLast()
numberOfAnswers -= 1
}
}) {
ForEach(answers.indices, id: \.self) { index in
TextField("Answer", text: $answers[index])
}
然而,当调用 onDecrement 时,这会导致 Index out of bounds 异常。
我尝试使用 ForEach(answers)
包装字符串以符合 Identifiable(在结构声明中使用 @State
),但是这会产生一条警告,指出该变量不会被更新。
我已尝试发布 here 的解决方案,但无济于事。
我不需要永久存储这个结果,因为它将传递给一个单独的函数,在按下按钮时进行 API 调用。
如有任何帮助,我们将不胜感激。
这里是固定的复制代码。使用 Xcode 11.4 / iOS 13.4
测试struct DemoView: View {
@State var numberOfAnswers = 2
@State private var answers: [String] = ["", ""]
var body: some View {
Stepper(onIncrement: {
if(self.numberOfAnswers < 10){
self.answers.append("")
self.numberOfAnswers += 1
}
},
onDecrement: {
if(self.numberOfAnswers > 2){
self.answers.removeLast()
self.numberOfAnswers -= 1
}
}) {
ForEach(Array(answers.enumerated()), id: \.0) { i, _ in
TextField("Answer", text: self.$answers[i])
}
}
}
}