Swift实现将UITextField内容存入Firestore数据库的问题
解决Firestore保存UITextField输入内容的问题
看了你的代码,问题主要出在数据保存的时机不对,以及没有在正确的位置使用train变量。原来的Firestore写入逻辑放在了viewDidLoad里,这会在页面刚加载时就把"TEST"存进去,而不是点击按钮时执行。另外,你在saveButton里定义的train变量是局部的,没有和Firestore的写入逻辑关联起来。
下面是修正后的完整代码,我会标注关键修改点:
import Foundation import UIKit import Firebase import FirebaseUI class TrainViewController: UIViewController{ @IBOutlet weak var trainField: UITextField! @IBOutlet weak var locationField: UITextField! @IBOutlet weak var engineField: UITextField! @IBAction func saveButton(_ sender: UIButton) { // 1. 安全获取输入框内容,避免强制解包导致崩溃 guard let train = trainField.text, !train.isEmpty, let location = locationField.text, !location.isEmpty, let engine = engineField.text, !engine.isEmpty else { // 如果有输入为空,可以给用户提示 let alert = UIAlertController(title: "提示", message: "请填写所有字段", preferredStyle: .alert) alert.addAction(UIAlertAction(title: "确定", style: .default)) present(alert, animated: true) return } // 2. 创建包含输入内容的字典 let dict = [ "train": train, "location": location, "engine": engine ] // 3. 写入Firestore数据库 let db = Firestore.firestore() db.collection("users").addDocument(data: dict) { error in if let error = error { print("保存数据失败: \(error.localizedDescription)") } else { print("数据保存成功!") // 可以在这里清空输入框或者给用户反馈 self.trainField.text = "" self.locationField.text = "" self.engineField.text = "" } } } override func viewDidLoad() { super.viewDidLoad() trainField.delegate = self // 移除原来在这里的Firestore写入代码,因为这不是点击按钮触发的逻辑 } } extension TrainViewController : UITextFieldDelegate { func textFieldShouldReturn(_ textField: UITextField) -> Bool { textField.resignFirstResponder() return true } }
关键修改说明:
- 把所有Firestore相关逻辑移到
saveButton方法里:这样只有点击按钮时才会执行保存操作,完全符合你的需求。 - 安全获取输入内容:用
guard let做可选绑定,同时检查内容不为空,避免用户输入空字符串或者输入框为nil时崩溃,还能给用户友好的提示。 - 加入错误处理:Firestore的
addDocument方法带有回调闭包,可以捕获保存失败的错误,方便调试和给用户反馈。 - 保存成功后清空输入框:提升用户体验,让用户直观知道操作已完成。
这样修改后,点击按钮就能把三个输入框的内容正确保存到Firestore的users集合里了。
内容的提问来源于stack exchange,提问作者Matthew
相关产品推荐
相关产品推荐

