Вставить данные Firestore в окно выбора - PullRequest
0 голосов
/ 22 февраля 2019

Тема решена после того, как я получил помощь от комментариев.

Я видел другую ветку об этом, но она не помогла мне после нескольких часов попыток.Так что я не выбрал бы создание новой темы.(Извините за это)

В начале урока у меня есть это:

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

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

Внутри ViewDidLoad есть делегат и источник данных для выбора средства выбора.

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

Ошибка: невозможно преобразовать значение типа 'Any?'закрыть результат типа "Строка?"при возврате (dogElement.value как? [String: Any]) ?. values.first

Поэтому я пытаюсь выбрать данные из Firestore и вставить их в окно выбора.Но данные, которые я хочу выбрать, - это данные, которые я ввел при регистрации в приложении.Так что все уникальны.(Например, если вы регистрируетесь в приложении, ваши имена собак отличаются от моих.)

Поэтому я пытаюсь выбрать данные от конкретного пользователя.Но я понятия не имею, как это сделать.И результат пока пуст, я вообще не вижу никаких данных в окне выбора.Итак, я хотел бы получить помощь по этому вопросу!Ты бы сделал мою пятницу хорошей.:)

Структура базы данных: 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 голосов
/ 22 февраля 2019

Во-первых, вы не должны вызывать getDogs в titleForRow, вызывать его в viewDidLoad

Во-вторых, вам нужно вызвать 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()
                    }
                }
        }
    }
0 голосов
/ 22 февраля 2019

вы вызываете 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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...