You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 11:22:48