在Firebase中通过文本框搜索单个文档的实现方案
解决通过文本框输入获取Firestore单个文档的问题
你的需求是通过文本框输入文档名称,点击按钮后从Firestore的Airports集合中获取对应文档,目前固定名称能正常运行,只需调整两处代码即可实现动态输入:
1. 修改ContentView.swift
修正TextField的绑定对象,并添加触发查询的按钮:
import SwiftUI import Firebase struct ContentView: View { @EnvironmentObject var firestoreManager: FirestoreManager var body: some View { VStack(spacing: 16) { // 绑定到FirestoreManager的searchairport变量 TextField("输入机场名称", text: $firestoreManager.searchairport) .textFieldStyle(.roundedBorder) .padding(.horizontal) // 添加按钮触发查询 Button("查询机场信息") { firestoreManager.fetchRestaurant() } .buttonStyle(.borderedProminent) Text("ICAO: \(firestoreManager.name)") Text("海拔: \(firestoreManager.elevation)") Text("跑道: \(firestoreManager.runway)") } .padding() } } struct ContentView_Previews: PreviewProvider { static var previews: some View { ContentView() .environmentObject(FirestoreManager()) } }
2. 修改FirestoreManager.swift
移除初始化时自动调用的查询方法,确保只有点击按钮时才触发查询:
import Firebase import SwiftUI class FirestoreManager: ObservableObject { @Published var name: String = "" @Published var elevation: String = "" @Published var runway: String = "" @Published var searchairport: String = "" init() { // 移除初始查询调用,避免空值请求 } func fetchRestaurant() { // 先判断输入是否为空,避免无效查询 guard !searchairport.isEmpty else { print("请输入机场名称") return } let db = Firestore.firestore() let docRef = db.collection("Airports").document(searchairport) docRef.getDocument { (document, error) in guard error == nil else { print("查询错误: \(error ?? "")") return } if let document = document, document.exists { let data = document.data() if let data = data { self.name = data["name"] as? String ?? "" self.elevation = data["elevation"] as? String ?? "" self.runway = data["runway"] as? String ?? "" } } else { // 文档不存在时清空显示内容 self.name = "" self.elevation = "" self.runway = "" print("未找到对应机场文档") } } } }
关键修改说明
- 修正TextField绑定:原代码直接引用
$searchairport,实际需绑定到firestoreManager的searchairport属性,确保输入内容能传递到查询方法。 - 添加触发按钮:通过按钮点击调用查询方法,实现手动触发查询,避免初始空值请求。
- 移除初始化查询:原
init中的自动查询会导致启动时用空字符串请求,移除后仅在用户主动触发时执行查询。 - 增加空值与不存在判断:查询前检查输入是否为空,文档不存在时清空显示内容,提升用户体验。
内容的提问来源于stack exchange,提问作者alancord
相关产品推荐
相关产品推荐

