Firestore - отображение данных в табличном представлении - PullRequest
0 голосов
/ 05 мая 2018

Я пытаюсь отобразить данные моего Firestore в моем Tableview, но не могу их отобразить.

protocol DocumentSerializeable {
    init?(dictionary:[String:Any])
}

struct Sourse {
    var name: String
    var content: String
    var timeStamp: Date

    var dictionary: [String: Any] {
        return [
            "name": name,
            "content": content,
            "timestamp": timeStamp
        ]
    }
}


extension Sourse : DocumentSerializeable {
    init?(dictionary: [String : Any]) {
        guard let name = dictionary["name"] as? String,
            let content = dictionary["content"] as? String,
            let timeStamp = dictionary["timeStamp"] as? Date else {return nil}

        self.init(name: name, content: content, timeStamp: timeStamp)

    }
}

class SourseListTableViewController: UITableViewController {

    var db: Firestore!

    var sourseArray = [Sourse]()

    private var document: [DocumentSnapshot] = []

    override func viewDidLoad() {
        super.viewDidLoad()
        self.tableView.delegate = self
        self.tableView.dataSource = self

        //initalize Database
        db = Firestore.firestore()
        loadData()

    }

Сначала я попробовал этот код ниже, ошибок не было, но ничего не загружено в табличное представление.

func loadData() {
    db.collection("sourses").getDocuments() {
        snapshot, error in
        if let error = error {
            print("\(error.localizedDescription)")
        } else {
            self.sourseArray = snapshot!.documents.flatMap({Sourse(dictionary: $0.data())})
            DispatchQueue.main.async {
                self.tableView.reloadData()
            }
        }
    }
}

После некоторого исследования (чтение из Firestore - добавление в tableView при загрузке представления ) я попробовал этот код ниже, но у меня появляется ошибка «Не удается преобразовать значение типа» (name: String, content: String, timeStamp: Date?) 'К ожидаемому типу аргумента' Sourse '"Так что я попробовал его с удаленной датой из всего кода, но все еще не мог заставить ее работать.

func loadData() {
        db.collection("sourses").getDocuments() {
            snapshot, error in
            if let error = error {
                print("\(error.localizedDescription)")
            } else {
                for document in snapshot!.documents {

                    let data = document.data()
                    let name = data["name"] as? String ?? ""
                    let content = data["content"] as? String ?? ""
                    let timeStamp = data["timeStamp"] as? Date 

                    let newSourse = (name:name, content:content, timeStamp: timeStamp)
                    self.sourseArray.append(newSourse)
                }
            }
        }
    }

Вот мой номерOfRows / CellForRow, чтобы убедиться, что это не само представление таблицы. Я также дважды проверил «идентификатор ячейки» с моей раскадровкой.

override func numberOfSections(in tableView: UITableView) -> Int {
        return 1
    }

    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        // #warning Incomplete implementation, return the number of rows
        return sourseArray.count
    }


    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "SourseTableViewCell", for: indexPath)

        let sourse = sourseArray[indexPath.row]

        cell.textLabel?.text = "\(sourse.name)"
        cell.detailTextLabel?.text = "\(sourse.content)"

        return cell
    }

Ответы [ 2 ]

0 голосов
/ 05 мая 2018

rbaldwin рассказал мне об этом, его ответ правильный, я просто публикую функцию полной загрузки данных для записи.

func loadData() {
    db.collection("sourses").getDocuments() { (snapshot, error) in

        if let error = error {

            print(error.localizedDescription)

        } else {

            if let snapshot = snapshot {

                for document in snapshot.documents {

                    let data = document.data()
                    let name = data["name"] as? String ?? ""
                    let content = data["content"] as? String ?? ""
                    let timeStamp = data["timeStamp"] as? Date ?? Date()
                    let newSourse = Sourse(name:name, content:content, timeStamp: timeStamp)
                    self.sourseArray.append(newSourse)
                }
                self.tableView.reloadData()
            }
        }
    }
}
0 голосов
/ 05 мая 2018

Вам нужно перезагрузить ваш tableView после анализа вашего Snapshot. Это также не очень хорошая идея, чтобы принудительно развернуть ваш Snapshot:

.getDocuments { (snapshot, error) in

    if let error = error {

        print(error.localizedDescription)

    } else {

        if let snapshot = snapshot {

            for document in snapshot.documents {

                let data = document.data()
                let name = data["name"] as? String ?? ""
                let content = data["content"] as? String ?? ""
                let timeStamp = data["timeStamp"] as? Date ?? Date()
                let newSourse = Sourse(name:name, content:content, timeStamp: timeStamp)
                self.sourseArray.append(newSourse)
            }
            self.tableView.reloadData()
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...