Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios Firestore-在Tableview中显示数据_Ios_Swift_Uitableview_Google Cloud Firestore - Fatal编程技术网

Ios Firestore-在Tableview中显示数据

Ios Firestore-在Tableview中显示数据,ios,swift,uitableview,google-cloud-firestore,Ios,Swift,Uitableview,Google Cloud Firestore,我正试图将我的Firestore数据显示到我的Tableview中,但我似乎无法让它显示出来 protocol DocumentSerializeable { init?(dictionary:[String:Any]) } struct Sourse { var name: String var content: String var timeStamp: Date var dictionary: [String: Any] { re

我正试图将我的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()

    }
起初我在下面尝试了这段代码,没有错误,但是tableview中没有加载任何内容

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()
            }
        }
    }
}
经过一些研究(从中阅读),我尝试了下面的代码,但我得到了错误“无法将类型的值”(名称:String,内容:String,时间戳: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)
                }
            }
        }
    }
这是我的numberOfRows/CellForRow,以确保它不是tableview本身。我还用我的故事板仔细检查了“单元标识符”

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
    }

解析
快照后,需要重新加载
表视图
。强制展开快照也不是一个好主意:

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

解析
快照后,需要重新加载
表视图
。强制展开快照也不是一个好主意:

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

rbaldwin跟我讲了一遍,他的回答是正确的,我只是发布了完整的loaddata函数来记录

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

rbaldwin跟我讲了一遍,他的回答是正确的,我只是发布了完整的loaddata函数来记录

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

谢谢你的回复!过去几天我一直在研究这个问题。非常感谢!!我实现了“重新加载数据”,没有任何问题。但是,当我从快照中删除强制展开时,我得到的错误“可选类型'QuerySnapshot'的值”未展开;您的意思是使用“!”还是“?”?”此外,当我尝试解析日期对象时,我也得到了此错误,“使用未解析标识符'Date'”。知道原因吗?请确保编写
如果让快照=快照{/..
这将打开它(即,检查它是否为零,这样你的应用程序就不会崩溃!我实现了这一点,但后来我得到了这个错误“闭包参数列表的上下文类型需要两个参数,不能隐式忽略”检查你的确切语法。我已修改了答案,在
.getDocuments之后显示整个代码{
我明白你现在说的,它应该是这样的func loadData(){db.collection(“sourses”).getDocuments(){snapshot,如果let error=error{print((error.localizedDescription)”)中的错误}否则{if let snapshot=snapshot{对于snapshot.documents中的文档{let data=document.data()……它可以工作,但我得到两个错误“使用未解析标识符'date'”使用未解析标识符“timeStamp”感谢您的回复!我在过去几天一直在解决这个问题。非常感谢!!我实现了“重新加载数据”,没有任何问题。但是当我从快照中删除强制展开时,我得到了错误“可选类型'QuerySnapshot'的值未展开;您是想使用'!'还是'?'?”当我尝试解析日期对象时,也会出现此错误,“使用未解析标识符'Date'”。知道原因吗?请确保编写
如果let snapshot=snapshot{/..
将其展开(也就是说,检查它是否为nil,这样你的应用程序就不会崩溃!我实现了这一点,但随后出现了这样一个错误“闭包参数列表的上下文类型需要2个参数,不能隐式忽略”检查你的确切语法。我已经修改了答案,在
.getDocuments之后显示整个代码{
我明白你现在说的,它应该是这样的func loadData(){db.collection(“sourses”).getDocuments(){snapshot,如果let error=error{print((error.localizedDescription)”)中的错误}否则{if let snapshot=snapshot{对于snapshot.documents中的文档{let data=document.data()……它可以工作,但我得到两个错误“使用未解析标识符'date'”和使用未解析标识符'timeStamp'