【问题标题】:SwiftUI dynamically add/remove TextField with StepperSwiftUI 使用 Stepper 动态添加/删除 TextField
【发布时间】:2020-10-22 00:38:34
【问题描述】:

大家好,我是 SwiftUI 的新手,正在尝试找到一种巧妙的方法来在按下陡峭的加号或减号时添加或删除 TextField。

我现在有

@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 调用。

对此的任何帮助将不胜感激。

【问题讨论】:

    标签: ios swift swiftui swiftui-foreach


    【解决方案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])
                }
            }
        }
    }
    
    

    【讨论】:

    • 谢谢,正是我在寻找的东西,但是经过反思,您能否澄清id: \.1 的使用,Swift 如何将其用作 id 的 keyPath? 1 指的是什么?我知道enumerated() 返回值和索引对。此外,我注意到您回答了this,但我仍在寻找解决该行为的方法。
    • .enumerated返回元组数组[(index, element)],元组成员可以通过.0.1访问,所以\.1等价于之前使用的\.self
    • 我遇到了这个解决方案的问题,只有通过测试才注意到 - 抱歉。在动态添加的框中输入文本时,我一次只能输入一个字符,第一个字符经常被复制到其他框中。此外,偶尔会出现索引超出范围的异常。提前感谢您的帮助
    • 已更新。在这个简单的演示中,实际上修复是id: \.0。在实际项目中,我建议每个模型都有自己的唯一标识符。
    • 感谢您的回复,但是此解决方案在删除 TextField 时崩溃,即当按下步进器减号时。你的意思是一个模型用一个标识符包装一个字符串?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-06
    相关资源
    最近更新 更多