提问者:小点点

SwiftUI使用步进器动态添加/删除文本字段


大家好,我是SwiftUI的新手,正在尝试找到一种简单的方法来添加或删除文本字段,当一个陡峭的加号或减号被按下时。

我目前有

@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时,这会导致索引超出界限异常。 我尝试使用foreach(answers)包装字符串以符合Identiable(在struct声明中使用@state),但是这会产生一个警告,说明变量不会被更新。

我试过在这里贴出的解决方案,但没有效果。

我不需要持久地存储这个结果,因为它将被传递给一个单独的函数,在按钮按下时进行API调用。

如有任何帮助,我们将不胜感激。


共1个答案

匿名用户

这里是固定的复制代码。 使用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: \.1) { i, _ in
                TextField("Answer", text: self.$answers[i])
            }
        }
    }
}