通过向已有默认值的 TextField 输入新值来更新存储在 Firebase 上的数据

Posted

技术标签:

【中文标题】通过向已有默认值的 TextField 输入新值来更新存储在 Firebase 上的数据【英文标题】:Update the data stored on Firebase by inputting new values to TextFields where there have been default values 【发布时间】:2021-05-18 04:09:52 【问题描述】:

我设计了一种方法来根据这个link在文本字段中显示存储在Firebase上的数据。这是我的解决方案:

import Foundation
import SwiftUI

struct TextFieldWithDefaultValue: View 

    var model: userViewModel    // Actual a more complex view model
    var textFieldName: String
    @State var editedValue: String

    init(model: userViewModel, text: String) 
        self.model = model
        self.textFieldName = text
        switch self.textFieldName 
        case "Name": self._editedValue = State(wrappedValue: model.user.name)
        case "Bio": self._editedValue = State(wrappedValue: model.user.bio)
        case "Interest": self._editedValue = State(wrappedValue: model.user.interest)
            default: self._editedValue = State(wrappedValue: "No records")
        
    
    
    var body: some View 
       TextField(textFieldName, text: $editedValue)
    



它的不足之一是我无法绑定对象State的输入值。因此,Firebase 上的值永远不会改变。所以我的问题是,是否有一种快捷方式可以让我在用户输入与原始输入不同时更新值?这是我的其余代码:

@StateObject var currentUser: userViewModel
@State private var showingAlert = false
    
    
var body: some View 
TextFieldWithDefaultValue(model: currentUser, text: "Interest")
                        .padding()
                        .keyboardType(.numberPad)
                        .background(Color.white.opacity(0.06))
                        .cornerRadius(15)

Button(action: 
                        currentUser.updatePersonalInfo()
                        self.showingAlert = true
                    , label: 
                        Text("Save")
                            .foregroundColor(Color("Color"))
                            .fontWeight(/*@START_MENU_TOKEN@*/.bold/*@END_MENU_TOKEN@*/)
                            .padding(.vertical)
                            .frame(width: UIScreen.main.bounds.width - 100)
                            .clipShape(Capsule())
                    )
                    .disabled(currentUser.getName() != "" || currentUser.getInterest() != ""  || currentUser.getBio() != "" ? false : true)
                    .opacity(currentUser.getName() != "" || currentUser.getInterest() != ""  || currentUser.getBio() != "" ?  1 : 0.5)
                    .alert(isPresented: $showingAlert) 
                        () -> Alert in
                        Alert(title: Text("Congratulations!"), message: Text("Saved successfully!"), dismissButton: .default(Text("OK")))
                            

【问题讨论】:

【参考方案1】:

一种解决方法是设置 StateObject 变量,我将其传递给 TextField,并在视图中使用 init() 函数中的实际值。

@StateObject var currentUser: userViewModel

init(currentUser: userViewModel) 
        self._currentUser = StateObject(wrappedValue: currentUser)


TextField("Name", text: $currentUser.user.name)

【讨论】:

以上是关于通过向已有默认值的 TextField 输入新值来更新存储在 Firebase 上的数据的主要内容,如果未能解决你的问题,请参考以下文章

重置结构对象中的偏斜值

在 StreamBuilder 中具有初始值的 TextField

设置textfield 文字左边距

将 0 传递给具有默认值的函数

编写新变量和新值的字典。用它来定义值

SwiftUI 中的动画日期变化