如何解决UITableView - 意外地发现 nil Swift
我有问题。我有一个 tableview,我尝试在其中填充一些 firebase 数据,但是我的标签有错误。 “在隐式解包一个可选项时意外发现 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
解决方法
如果您使用原型单元格,则必须没有 tableView.register
代码。删除它。
仔细检查故事板中的表视图控制器检查器。确保它具有正确的类。
然后在情节提要中检查其原型单元格检查器。确保它具有正确的类。然后确保它有正确的标签插座。
,您需要正确注册单元格
self.tableView.register(UINib(nibName:"InfoTableViewCell",bundle: nil),forCellReuseIdentifier: cellReuseIdentifier)
在此处设置标识符
,代替
let newEntry = Info(address: data!["address"] as! String,name: data!["name"] as! String,phoneNumber: data!["phoneNumber"] as! String)
你必须使用这样的东西
guard let address = data?["address"] as? String else {return}
guard let name = data?["name"] as? String else {return}
guard let phoneNumber = data?["phoneNumber"] as? String else {return}
let newEntry = Info(address: address,name: name,phoneNumber: phoneNumber)
此方法将安全地解包您的数据,但请记住,如果每个数据都为空,您将没有任何数据,因此最好在 firebase 数据库中设置默认值以避免该问题
也适用于您的表格视图功能 而不是
let cell = tableView.dequeueReusableCell(withIdentifier: cellReuseIdentifier,for: indexPath) as! InfoTableViewCell
使用
guard let cell = tableView.dequeueReusableCell(withIdentifier: cellReuseIdentifier,for: indexPath) as? InfoTableViewCell else {return UITableViewCell()}
在这种情况下,您的单元格标识符没有写入正确,您的应用至少不会崩溃
,我已经解决了这个问题。我使用了一个 .xib 文件,现在正在工作。真的不知道为什么它不适用于原型细胞。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。