Swift 4中如何将Firestore的title数据展示到UIPicker
解决Firestore数据存入数组并展示到UIPicker的问题
嘿,作为Swift新手碰到Firestore异步操作的坑太正常了,我来帮你捋清楚怎么把title存进数组并显示到Picker里:
1. 先声明类级别的数组
首先你得把存储title的数组放在类的作用域里,而不是闭包的局部变量——不然闭包执行完数组就被销毁了,外面根本拿不到数据。比如在你的ViewController里:
class YourViewController: UIViewController, UIPickerViewDataSource, UIPickerViewDelegate { // 用来存Programme的title数组,生命周期和类一致 var programmeTitles: [String] = [] // 关联你的UIPickerView实例 @IBOutlet weak var programmePicker: UIPickerView! // ...其他代码 }
2. 修改Firestore数据获取函数
接下来调整你的getprogram函数,重点处理异步闭包的数组赋值和Picker刷新——Firestore的请求是异步的,等数据拿到后必须手动通知Picker更新:
func getprogram() { let db = Firestore.firestore() db.collection("Programme").getDocuments() { [weak self] (querySnapshot, err) in guard let self = self else { return } if let err = err { print("获取数据失败: \(err.localizedDescription)") return } // 先清空旧数据,避免重复加载 self.programmeTitles.removeAll() // 遍历所有文档,提取title字段 for document in querySnapshot!.documents { // 处理可选值,防止某个文档没有title导致崩溃 if let title = document.data()["title"] as? String { self.programmeTitles.append(title) } else { // 可选:可以打印日志提示哪个文档缺失字段 print("文档 \(document.documentID) 没有title字段") } } // 数据加载完成后,刷新PickerView self.programmePicker.reloadAllComponents() } }
这里要注意两个关键细节:
- 用
[weak self]避免循环引用,Swift里闭包引用self一定要注意内存问题 - 必须调用
reloadAllComponents(),因为Firestore请求完成时Picker已经初始化了,需要手动触发刷新
3. 实现UIPickerView的核心方法
要让Picker显示数据,必须实现它的数据源和代理方法:
// Picker的列数(这里只需要1列) func numberOfComponents(in pickerView: UIPickerView) -> Int { return 1 } // 每列的行数(就是数组的元素数量) func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int { return programmeTitles.count } // 每行显示的内容(取数组对应位置的title) func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? { return programmeTitles[row] }
4. 启动数据加载
最后在合适的时机调用getprogram,比如viewDidLoad里,同时别忘了设置Picker的数据源和代理:
override func viewDidLoad() { super.viewDidLoad() // 设置Picker的数据源和代理为当前ViewController programmePicker.dataSource = self programmePicker.delegate = self // 开始加载Firestore数据 getprogram() }
这样改完之后,你就能把Firestore里的所有title存入数组,并且正常展示在UIPicker里了。
内容的提问来源于stack exchange,提问作者madhatter989
相关产品推荐
相关产品推荐

