通过向已有默认值的 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 上的数据的主要内容,如果未能解决你的问题,请参考以下文章