斯威夫特用户界面 |文本字段未读取输入的值

Posted

技术标签:

【中文标题】斯威夫特用户界面 |文本字段未读取输入的值【英文标题】:Swift UI | Textfield not reading entered value 【发布时间】:2020-10-25 20:18:28 【问题描述】:

我有一个文本字段,它应该记录某人吃过的食品的单位,然后用于计算用户消耗的卡路里、蛋白质等的总数。但是当在文本字段中输入值时,units 变量不会更新。我该如何解决这个问题?

这是我的代码:

@State var selectFood = 0
@State var units = 0
@State var quantity = 1.0
    
@State var caloriesInput = 0.0
@State var proteinInput = 0.0
@State var carbsInput = 0.0
@State var fatsInput = 0.0

var body: some View 
    VStack 
        
        Group 
            Picker(selection: $selectFood, label: Text("What did you eat?")
                    .font(.title)
                    .fontWeight(.bold)
                    .foregroundColor(.white))
            
                ForEach(database.productList.indices, id: \.self)  i in
                    Text(database.productList[i].name)
                
            
            .pickerStyle(MenuPickerStyle())
                
            Spacer(minLength: 25)
                
            Text("How much did you have?")
                .font(.headline)
                .fontWeight(.bold)
                .foregroundColor(.white)
                .frame(alignment: .leading)

            //Textfield not working.
            TextField("Units", value: $units, formatter: NumberFormatter())
                .padding(10)
                .background(Color("Settings"))
                .cornerRadius(10)
                .foregroundColor(Color("Background"))
                .keyboardType(.numberPad)
                
            Button (action: 
                self.quantity = ((database.productList[selectFood].weight) * Double(self.units)) / 100
                    
                caloriesInput = database.productList[selectFood].calories * quantity
                proteinInput = database.productList[selectFood].protein * quantity
                carbsInput = database.productList[selectFood].carbs * quantity
                fatsInput = database.productList[selectFood].fats * quantity
                    
                UIApplication.shared.hideKeyboard()
                    
            ) 
                ZStack 
                    Rectangle()
                        .frame(width: 90, height: 40, alignment: .center)
                        .background(Color(.black))
                        .opacity(0.20)
                        .cornerRadius(15)
                                    ;
                    Text("Enter")
                        .foregroundColor(.white)
                        .fontWeight(.bold)
                 
             
        
    

【问题讨论】:

units 是如何声明的? @JoakimDanielson 我已经添加了初始化变量 带有格式化程序的文本字段仅在提交时更新绑定变量。以下内容应该会有所帮助***.com/a/59509242/12299030。 【参考方案1】:

这是NumberFormatter 的一个问题,已经持续了一段时间。如果您删除格式化程序,它会正确更新。

这是一种解决方法。遗憾的是它需要 2 个变量。

import SwiftUI

struct TFConnection: View 
    @State var unitsD: Double = 0
    @State var unitsS = ""
    
    var body: some View 
        VStack
            //value does not get extracted properly
            TextField("units", text: Binding<String>(
                        get:  unitsS ,
                        set: 
                            if let value = NumberFormatter().number(from: $0) 
                                print("valid value")
                                self.unitsD = value.doubleValue
                            else
                                unitsS = $0
                                //Remove the invalid character it is not flawless the user can move to in-between the string
                                unitsS.removeLast()
                                print(unitsS)
                            
                        ))
            
            Button("enter")
                print("enter action")
                print(unitsD.description)
            
        
    


struct TFConnection_Previews: PreviewProvider 
    static var previews: some View 
        TFConnection()
    

【讨论】:

以上是关于斯威夫特用户界面 |文本字段未读取输入的值的主要内容,如果未能解决你的问题,请参考以下文章

用户输入的值保存到 Core Data (?) 但未出现在表视图中

如果没有输入任何内容,Word遗留文本表单字段的值是多少?

当用户在文本字段中快速输入键时如何显示键的值

在 AS3 中自动检测输入文本字段的值

自动检测AS3中输入文本字段的值

检查输入到文本字段的值是不是是给定范围内的整数