swift - 在 PickerView 中显示 Firebase 数据
问题描述
代码已更新并按预期工作
我有一个带有文本字段和 PickerView 的视图控制器。我想在 PickerView 中显示我存储在 Firebase 中的数据。我能够从 Firebase 检索和打印数据,但我找不到在 PickerView 中显示它的方法。这是我的代码:
import UIKit
import Firebase
class pickerVC: UIViewController, UIPickerViewDelegate, UIPickerViewDataSource, UITextFieldDelegate {
@IBOutlet weak var labelTxt: UITextField!
@IBOutlet weak var infoPickerViewer: UIPickerView!
var dbRef: CollectionReference!
var pickerView: UIPickerView?
var itemsClass = [ItemInfo]()
override func viewDidLoad() {
super.viewDidLoad()
let pickerView = UIPickerView()
infoPickerViewer.delegate = self
infoPickerViewer.dataSource = self
dbRef = Firestore.firestore().collection(ITEMS_REF)
labelTxt.inputView = pickerView
labelTxt.delegate = self
self.infoPickerViewer = pickerView
self.infoPickerViewer?.delegate = self
self.infoPickerViewer?.dataSource = self
self.infoPickerViewer.reloadAllComponents()
getItems()
}
func numberOfComponents(in pickerView: UIPickerView) -> Int {
return 1
}
func textFieldDidBeginEditing(_ textField: UITextField) {
labelTxt = textField
}
func textFieldShouldBeginEditing(_ textField: UITextField) -> Bool {
self.pickerView?.reloadAllComponents()
return true
}
func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
if labelTxt.isFirstResponder {
return self.itemsClass.count
}
return 0
}
func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
if labelTxt.isFirstResponder {
return itemsClass[row].itemName
}
return nil
}
func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
if labelTxt.isFirstResponder {
let item = itemsClass[row].itemName
labelTxt.text = item
}
}
func getItems() {
dbRef.getDocuments { (snapshot, error) in
if let err = error {
debugPrint("error fetching docs: \(err)")
} else {
self.infoPickerViewer.reloadAllComponents()
let snap = snapshot
for document in snap!.documents {
let data = document.data()
let itemCode = data[ITEMS_CODE] as? String ?? ""
let itemName = data[ITEMS_NAME] as? String ?? ""
let t = ItemInfo(itemCode: itemCode, itemName: itemName)
self.itemsClass.append(t)
print("ITEMS_CODE", itemCode as Any)
print("ITEMS_NAME", itemName as Any)
}
}
}
}
}
Firebase 数据库的结构如下:
collection/AutoID/itemCode: "item1"
itemName: "item2"
collection/AutoID/itemCode: "item3"
itemName: "item4"
我只需要在 PickerView 中显示 itemName,itemCode 我将使用它来根据 PickerView 中的选择运行查询。
对此的任何帮助将不胜感激。
解决方案
推荐阅读
- javascript - 使用 Jest 模拟返回函数的 node_modules?
- amazon-web-services - 在 y 轴上对堆叠图进行排序
- python - Python通过从正则表达式模式拆分来创建字符串元组列表
- html - 无法制作响应式搜索栏和下拉菜单
- sql-server - 为什么 Rank() OVER PARTITION 通过返回太多结果
- c++ - 将基类析构函数公开为虚拟意味着破坏 ABI 向后兼容性?
- rust - gtk-rs app 给出警告“您的应用程序没有实现 g_application_activate() 并且没有连接到 'activate' 信号的处理程序”
- python - 使用 Tkinter 时无法更新分数
- ruby-on-rails - 从 ActiveStorage+DirectUpload 中删除未使用的文件
- node.js - 找不到模块“../encodings”