Почему я получаю ошибку ссылки на документ о сегментах в Swift? - PullRequest
0 голосов
/ 22 мая 2019

Я отображаю документы из моей базы данных Firebase Firestore в UITableView.Я создал массив с именем parties, в котором хранится моя пользовательская модель данных Party.Данные отображаются правильно, однако всякий раз, когда я выбираю ячейку, приложение аварийно завершает работу и возвращает ошибку «Недопустимая ссылка на документ. Ссылки на документы должны иметь четное количество сегментов, но hwh3cztnfcd5aC5ZRgyPNpFUsS33 имеет 1».

Iпопытался удалить метод didSelectRowAt, но ошибка все равно появится.

Это созданная мной функция, которая загружает данные из Firebase Firestore.

func loadAllParties() {
    // Remove all data from the array parties.
    parties.removeAll()

    if Auth.auth().currentUser != nil {
        if let user = Auth.auth().currentUser {
            // The user's ID, unique to the Firebase project.
            let uid = user.uid

            let db = Firestore.firestore()
                db.collection(uid).order(by: "timeStamp", descending: false).getDocuments() { (snapshot, error) in
                    if error != nil {
                        print("Unable to get documents: \(error)")
                    } else {
                        for document in (snapshot!.documents) {
                            let title = document.data()["title"] as? String ?? "New Party"
                            let location = document.data()["date"] as? String ?? "No Location"
                            let date = document.data()["date"] as? String ?? "No Date"
                            let startTime = document.data()["startTime"] as? String ?? "No Start Time"
                            let endTime = document.data()["endTime"] as? String ?? "No End Time"
                            let notes = document.data()["notes"] as? String ?? "No Notes"

                            self.parties.append(Party(title: title, location: location, date: date, startTime: startTime, endTime: endTime, notes: notes))
                            self.displayOnboardingIfNeccessary()
                    }
                }
            }
        }
    } else {
        print("No user is currently signed in.")
    }
}

Это код для didSelectRowAt.

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    let party = yourPartiesTableView.indexPathForSelectedRow
    let cell = tableView.cellForRow(at: party!) as! YourPartiesTableViewCell

    selectedParty = cell.titleLabel.text

    performSegue(withIdentifier: "showPartyViewController", sender: self)
}

Я ожидал, что когда вы нажмете на ячейку, он перейдет к следующему контроллеру представления и позволит этому контроллеру представления узнать, какие данные получить из Firebase на этой странице.

1 Ответ

0 голосов
/ 23 мая 2019

Что / почему это let party = yourPartiesTableView.indexPathForSelectedRow?

Вы знаете постучавший ряд из indexPath.row, так что

let row = indexPath.row

Тогда получите группу из вашего массива данных , а не из таблицы.

let party = self.parties[row]

и получите название от этого

let title = party.title

как говорится ... другая часть вопроса

Если вы коснитесь ячейки, она перейдет к следующему контроллеру представления. и пусть тот контроллер представления знает, какие данные получить от Firebase на эта страница.

Вот несколько вариантов, чтобы это произошло.

Если вам известен .documentID (ключ) участника, вы можете получить его и передать его в контроллер подробного представления, где он будет загружать данные из Firestore на основе этого ключа.

Второй вариант - вы передаете сам объект вечеринки, и он будет заполняться этим объектом. Недостатком является то, что данные не обновляются в реальном времени. То есть, если вы передадите ключ, вы можете прикрепить наблюдателя к этому документу (узлу) Firestore, поэтому, если какие-либо изменения будут иметь место во время просмотра деталей, они появятся в пользовательском интерфейсе. .

Существует также около 162 других вариантов, но они могут быть хорошей отправной точкой.

Примечание: вы можете рассмотреть возможность добавления свойства .document_id к вашему классу Party, так что если что-то изменится / нужно будет отредактировать / удалить и т. Д., Вы будете знать, какой это документ через этот идентификатор_документа (. documentID )

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...