将Firestore数据插入pickerview

时间:2019-02-22 12:42:51

标签: ios swift firebase google-cloud-firestore

从注释中获得帮助后,线程已解决。

我看到了与此相关的另一个线索,但是经过数小时的尝试,它并没有帮助我。因此,我别无选择地创建一个新线程。 (很抱歉)

在课程开始时,我要这样做:

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

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

在ViewDidLoad中,我已为pickerview委托和数据源。

    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()
            }
    }
}
  

错误:无法转换“任何类型”的值?到关闭结果类型   '串?'返回(dogElement.value为?[字符串:   任何])?. 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()
            }

2 个答案:

答案 0 :(得分:3)

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

您应该首先调用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()

答案 1 :(得分:2)

首先,您不应在getDogs中调用titleForRowviewDidLoad中调用

第二,您需要在循环后调用reload。

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 data = document.data()
                        let dogs = data["Dogs"] as? String ?? ""

                        self.dogsArray.append(dogs)
                    }

                    DispatchQueue.main.async
                    {
                        self.pickerView.reloadAllComponents()
                    }
                }
        }
    }