gpt4 book ai didi

ios - 将 Firestore 数据插入 pickerview

转载 作者:行者123 更新时间:2023-11-28 10:05:16 25 4
gpt4 key购买 nike

在我得到评论的帮助后,线程解决了。

我看到了另一个与此相关的帖子,但经过数小时的尝试后它对我没有帮助。所以我别无选择创建一个新线程。 (对此感到抱歉)

在类(class)开始时我有这个:

//Firestore connection
let db = Firestore.firestore()

//Create an array of items to insert into pickerview
var dogsArray: [String] = []

在 ViewDidLoad 中,我有 pickerview 的委托(delegate)和数据源。

    override func viewDidLoad()
{
super.viewDidLoad()

getDogs()


self.pickerView.delegate = self
self.pickerView.dataSource = self

}

稍微往下看,我得到了这段代码:

func numberOfComponents(in pickerView: UIPickerView) -> Int
{
return 1
}

func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String?
{
return dogsArray[row]
}

func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int
{
return dogsArray.count
}

func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int)
{
labeltest.text = dogsArray[row]
}

func getDogs()
{
db.collection("Dogs").getDocuments
{ (QuerySnapshot, err) in
if err != nil
{
print("Error getting documents: \(String(describing: err))");
}
else
{
for document in QuerySnapshot!.documents
{
let document = QuerySnapshot!.documents.first
let data = document!.data()
data.forEach { (item) in
if let dogOneData = data["Dog1"] as? String {
self.dogsArray.append(dogOneData)
}

if let dogTwoData = data["Dog2"] as? String {
self.dogsArray.append(dogTwoData)
}

if let dogThreeData = data["Dog3"] as? String {
self.dogsArray.append(dogThreeData)
}

}
self.pickerView.reloadAllComponents()
}
}
}

Error: Cannot convert value of type 'Any?' to closure result type 'String?' on the return (dogElement.value as? [String: Any])?.values.first

因此,我尝试从 Firestore 中选择数据并将其插入到 pickerview 中。但是我要选择的数据是我在应用程序上注册时输入的数据。所以每个人都是独一无二的。(例如,如果您在应用程序上注册,您的狗的名字与我的不同。)

所以我正在尝试从特定用户中选择数据。但我不知道该怎么做。现在结果是空白的,我在 pickerview 中根本看不到任何数据。所以,我很想在这方面得到一些帮助!你会让我的星期五过得愉快。 :)

数据库结构:structure


解决后的结果:

//Function getDogs()
func getDogs()
{
//Authentication
let authentication = Auth.auth().currentUser?.uid

//Choosing collection
db.collection("users").document(authentication!).collection("Dogs").getDocuments()
{ (QuerySnapshot, err) in
if err != nil
{
print("Error getting documents: \(String(describing: err))");
}
else
{
//For-loop
for _ in QuerySnapshot!.documents
{
self.dogsArray.removeAll()
let document = QuerySnapshot!.documents.first
let data = document!.data()
data.forEach { (item) in
if let dogOneData = data["Dog1"] as? String {
self.dogsArray.append(dogOneData)
}

if let dogTwoData = data["Dog2"] as? String {
self.dogsArray.append(dogTwoData)
}

if let dogThreeData = data["Dog3"] as? String {
self.dogsArray.append(dogThreeData)
}

}
self.pickerView.reloadAllComponents()
}

最佳答案

您在委托(delegate)函数上调用 getData 并且因为它是不同步的,所以在调用其余委托(delegate)函数之前它们不会被加载。

您应该先调用getData() 函数,然后重新加载PickerviewDataSource

例如在 viewDidAppear() 函数上调用

getDogs()

并在循环之后的 getDogs() 函数中添加

    dogsArray.removeAll()
let document = QuerySnapshot!.documents.first
let data = document.data()
data.forEach { (item) in
if let dogOneData = item["Dog1"] as? String {
dogsArray.append(dogOneData)
}

if let dogTwoData = item["Dog2"] as? String {
dogsArray.append(dogTwoData)
}

if let dogThreeData = item["Dog3"] as? String {
dogsArray.append(dogThreeData)
}
}

self.pickerView.reloadAllComponents()

关于ios - 将 Firestore 数据插入 pickerview,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54827439/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com