【问题标题】:How to modify a user input inside a SwiftUI form loop如何在 SwiftUI 表单循环中修改用户输入
【发布时间】:2020-10-24 17:19:30
【问题描述】:

我正在 Xcode 11 中开发一个简单的 SwiftUI 应用程序。我想要一个表单,它可以遍历多个用户输入字符串并显示一个带有按钮的表单。当用户按下按钮时,它会修改输入值——特别是增加或减少它。

但是,当传递像 UserInput().foo 这样的引用数组时,其中 UserInput 是已发布的可观察对象,我无法修改 ForEach 内的值,因为 ForEach 传递了与原始引用相反的副本(至少这是我的基本理解) .然后我该如何尝试实现它?我读到了inout,每个人都说要避免它,但这肯定是一个相对普遍的问题。

我做了一个简单的例子来说明我正在尝试做的事情,但我无法完全解决:

import SwiftUI

class UserInput: ObservableObject {
    @Published var foo: String = ""
    @Published var bar: String = ""
}
struct ContentView: View {
    
    @ObservedObject var input = UserInput()
    
    var body: some View {
        LoopInputs()
    }
    func LoopInputs() -> AnyView?{
        
        var userinputs = [
            [UserInput().foo, "Foo"],
            [UserInput().bar, "Bar"]
        ]
        
        var inputs: some View{
            VStack(){
                ForEach(userinputs, id: \.self){userinput in
                    Text("\(userinput[1]): \(String(userinput[0]))")
                    Button(action: {
                        increment(input: String(userinput[0]))
                    }){
                        Text("Increase")
                    }
                }
            }
        }
        
        return AnyView(inputs)
    }
    func increment(input: String){
        var lead = Int(input) ?? 0
        lead += 1
        //    input = String(lead)
    }
}

【问题讨论】:

  • 我无法理解这个快照,它根本不适用于var input。你能详细说明一下吗?

标签: swift swiftui swiftui-form


【解决方案1】:

据我了解,向用户输入添加值时,ForEach 值不会改变。 好吧,如果是这种情况,首先,您可以尝试创建一个结构,并在其中声明 foo 和 bar,然后只需声明该结构类型的变量。它看起来像这样:

struct Input: Identifiable {
    var id = UUID()
    var foo: String
    var bar: String
}
class UserInput: ObservableObject {
    @Published var inputs: [Input] = [Input]()
}
//ContentView
struct ContentView: View {
    @ObservedObject var input = UserInput()
    var body: some View {
        LoopInputs()
    }
    func LoopInputs() -> AnyView? {
        var inputs: some View {
            VStack {
                ForEach(input.inputs) { userinput in
                    Text("\(userinput.bar): \(String(userinput.foo))")
                    Button(action: {
                        increment(input: String(userinput.foo))
                    }) {
                        Text("Increase")
                    }
                }
            }
        }
        return AnyView(inputs)
    }
    func increment(input: String) {
        var lead = Int(input) ?? 0
        lead += 1
    //    input = String(lead)
    }
}

不是更简单更优雅吗?

【讨论】:

    猜你喜欢
    • 2019-08-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-27
    • 1970-01-01
    相关资源
    最近更新 更多