SwiftUI динамически добавляет / удаляет TextField с помощью Stepper

Привет всем, я новичок в 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. Я попытался обернуть String в соответствии с Identifiable (с@State внутри объявления структуры), используя ForEach(answers) однако это вызывает предупреждение о том, что переменная не будет обновлена.

Я пробовал размещенные здесь решения, но безрезультатно.

Мне не нужно постоянно сохранять результат этого, так как он будет передан отдельной функции, выполняющей вызов 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: \.0) { i, _ in
                TextField("Answer", text: self.$answers[i])
            }
        }
    }
}

Другие вопросы по тегам