Ios Firestore-在Tableview中显示数据
我正试图将我的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
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'