微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

UITableView - 意外地发现 nil Swift

如何解决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)

在此处设置标识符

enter image description here

,

代替

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 举报,一经查实,本站将立刻删除。