【发布时间】:2021-05-19 22:28:38
【问题描述】:
我有问题。我有一个表格视图,我尝试从中填充一些 firebase 数据,但我的标签有错误。 “在隐式展开可选时意外发现 nil”。在控制台中,标签显示为 nil。我已经正确连接了我的 iboutlets,并且我已经在检查器中设置了“reuseIdentifier”。我正在使用原型单元。
我的全班:
struct Info {
var address: String
var name: String
var phoneNumber: String
}
class InfoViewController: UITableViewController
{
let cellReuseIdentifier = "cell"
var info: [Info] = []
override func viewDidLoad() {
super.viewDidLoad()
getCartProducts()
self.tableView.register(InfoTableViewCell.self, forCellReuseIdentifier: cellReuseIdentifier)
navigationItem.title = "Profilul meu"
}
func getCartProducts() {
let db = Firestore.firestore()
let userID = (Auth.auth().currentUser?.uid)!
db.collection("Users").document(userID).getDocument{ (document, error) in
if let error = error {
print(error)
return
} else {
if let document = document {
let data = document.data()
let newEntry = Info(address: data!["address"] as! String, name: data!["name"] as! String , phoneNumber: data!["phoneNumber"] as! String
)
self.info.append(newEntry)
}
}
DispatchQueue.main.async {
// self.datas = self.filteredData
self.tableView.reloadData()
}
}
}
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return info.count
}
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: cellReuseIdentifier, for: indexPath) as! InfoTableViewCell
let infos = info[indexPath.row]
cell.numeL.text = infos.name
cell.adresaL.text = infos.address
cell.telefonL.text = infos.phoneNumber
return cell
}
}
还有我的 Cell 课程,如果这也有帮助的话:
class InfoTableViewCell: UITableViewCell {
@IBOutlet weak var adresaL: UILabel!
@IBOutlet weak var numeL: UILabel!
@IBOutlet weak var telefonL: UILabel!
override func awakeFromNib() {
super.awakeFromNib()
// Initialization code
}
override func setSelected(_ selected: Bool, animated: Bool) {
super.setSelected(selected, animated: animated)
// Configure the view for the selected state
}
}
错误在:
cell.numeL.text = infos.name
cell.adresaL.text = infos.address
cell.telefonL.text = infos.phoneNumber
【问题讨论】:
-
使用
!和as!解包本质上是危险的,并且可能导致此崩溃。查看您使用它的所有地方并学习使用if let和guard let(“可选绑定”)来处理您可能拥有nil值的情况。 docs.swift.org/swift-book/LanguageGuide/TheBasics.html -
在 Firebase 闭包中不需要
DispatchQueue.main.async {; UI 调用总是在主线程上完成。在从 firebase 加载数据并刷新 tableView 之前,也要这样做self.tableView.register(InfoTableViewCell.self, forCellReuseIdentifier: cellReuseIdentifier)。
标签: swift firebase uitableview