【问题标题】:SwiftUI - Subtotal TextField entries across multiple viewsSwiftUI - 跨多个视图的小计 TextField 条目
【发布时间】:2022-01-11 10:22:18
【问题描述】:

我有多个由 ForEACH 创建的视图。每个视图都有一个文本字段,用户可以在其中输入数字。我想对每个视图中的每个条目进行小计。换句话说,对每个视图中的绑定进行小计。

我的方法错了吗?

ForEach(someArray.allCases, id: \.id) { item in
                    CustomeRowView(name: item.rawValue)
                }
struct CustomeRowView: View {
    
   
    var name: String
    @State private var amount: String = ""
    
    
    var body: some View {
        
        VStack {
            
            HStack {
                Label(name, systemImage: image)
 
                
                VStack {
                    TextField("Amount", text: $amount)
                        .frame(width: UIScreen.main.bounds.width / 7)
        
                    
                }

            }
         
        }
    }
 
}

任何帮助将不胜感激。

【问题讨论】:

    标签: swiftui textfield subtotal


    【解决方案1】:

    有很多方法可以实现您的要求。我在这里介绍一个非常 简单的方法,使用ObservableObject 将信息保存在一个地方。 它具有add 到信息字典fruits 的功能。

    @StateObjectContentView 中创建,以保留一个单一的事实来源。 它使用@ObservedObject 传递给CustomeRowView 视图,并用于计数 按下返回键时TextField 的输入 (.onSubmit)。

    import SwiftUI
    
    @main
    struct TestApp: App {
        var body: some Scene {
            WindowGroup {
                ContentView()
            }
        }
    }
    
    class FruitCake: ObservableObject {
        @Published var fruits: [String : Int] = ["apples":0,"oranges":0,"bananas":0]
        
        // adjust for you purpose
        func add(to name: String, amount: Int) {
            if let k = fruits.keys.first(where: {$0 == name}),
               let sum = fruits[k] {
                fruits[k] = sum + amount
            }
        }
    }
        
    struct ContentView: View {
        @StateObject var fruitCake = FruitCake()
        
        var body: some View {
            VStack {
                ForEach(Array(fruitCake.fruits.keys), id: \.self) { item in
                    CustomeRowView(name: item, fruitCake: fruitCake)
                }
            }
        }
    }
    
    struct CustomeRowView: View {
        let name: String
        @ObservedObject var fruitCake: FruitCake
        @State private var amount = 0
        
        var body: some View {
            HStack {
                Label(name, systemImage: "info")
                TextField("Amount", value: $amount, format: .number)
                    .frame(width: UIScreen.main.bounds.width / 7)
                    .border(.red)
                    .onSubmit {
                        fruitCake.add(to: name, amount: amount)
                    }
                // subtotal
                Text("\(fruitCake.fruits[name] ?? 0)")
            }
        }
        
    }
    

    【讨论】:

    • 感谢您的快速回复和答复。非常感谢。
    猜你喜欢
    • 1970-01-01
    • 2021-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多