Firebase认证APP中TableView单元格重复崩溃问题求助
问题分析与解决方案
看起来你遇到的核心问题是全局数组重复追加数据导致的单元格重复,进而引发点击崩溃。让我一步步帮你解决:
问题根源
你的tableauDonnees是全局变量,每次用户登录进入TableView页面时,viewDidLoad都会调用contenuDeChaqueCellule(),而这个函数只会往数组里追加新元素,不会清空之前的内容。随着用户登出再登录的次数增加,数组里的ContenuCellule对象会越来越多,TableView自然就显示重复的单元格。
至于点击崩溃,大概率是因为重复的单元格对应的数组索引超过了tableauImages的长度(只有5个元素),当你尝试用超出范围的索引去取图片名时,就会触发数组越界错误,导致APP崩溃。
快速修复方案
最简单的办法是在填充数组前先清空它,修改contenuDeChaqueCellule()函数:
func contenuDeChaqueCellule () { // 关键:先清空数组,避免重复添加 tableauDonnees.removeAll() let chapitre1 = ContenuCellule(label: "Le Mbigi Muntu", image: tableauImages[0]) let chapitre2 = ContenuCellule(label: "Taureau de boeuf", image: tableauImages[1]) let chapitre3 = ContenuCellule(label: "Les billets ensorcelés", image: tableauImages[2]) let chapitre4 = ContenuCellule(label: "Baron Samedi", image: tableauImages[3]) let chapitre5 = ContenuCellule(label: "Le temple maudit", image: tableauImages[4]) tableauDonnees.append(chapitre1) tableauDonnees.append(chapitre2) tableauDonnees.append(chapitre3) tableauDonnees.append(chapitre4) tableauDonnees.append(chapitre5) }
更优雅的优化方案
全局变量容易引发这类状态残留问题,建议把tableauDonnees改成TableView所在ViewController的实例变量,这样每次ViewController初始化时,数组都是全新的空数组:
// 把原来的全局tableauDonnees删掉,移到ViewController内部 class YourTableViewController: UIViewController, UITableViewDataSource, UITableViewDelegate { // 定义为实例变量,每次VC创建时都是空数组 private var tableauDonnees = [ContenuCellule]() // 可以把图片数组也移进来,避免全局依赖 private let tableauImages = ["mbigiMuntu1", "taureauDeboeuf1", "billets1", "baronSamedi1", "temple" ] override func viewDidLoad() { super.viewDidLoad() populateTableViewData() tableView.tableFooterView = UIView() print("table view cell displayed") } // 重命名函数,语义更清晰 private func populateTableViewData() { // 这里不需要清空,因为每次VC初始化数组都是空的 let chapitres = [ ContenuCellule(label: "Le Mbigi Muntu", image: tableauImages[0]), ContenuCellule(label: "Taureau de boeuf", image: tableauImages[1]), ContenuCellule(label: "Les billets ensorcelés", image: tableauImages[2]), ContenuCellule(label: "Baron Samedi", image: tableauImages[3]), ContenuCellule(label: "Le temple maudit", image: tableauImages[4]) ] tableauDonnees.append(contentsOf: chapitres) // 刷新TableView,保证数据更新后界面同步 tableView.reloadData() } // ...你的TableView数据源方法(比如numberOfRowsInSection、cellForRowAt) }
额外简化技巧
可以用zip和map让数据填充代码更简洁,避免重复创建对象:
private func populateTableViewData() { let labels = [ "Le Mbigi Muntu", "Taureau de boeuf", "Les billets ensorcelés", "Baron Samedi", "Le temple maudit" ] tableauDonnees = zip(labels, tableauImages).map { ContenuCellule(label: $0.0, image: $0.1) } tableView.reloadData() }
这样代码更紧凑,也不容易出现拼写错误。
内容的提问来源于stack exchange,提问作者LEKYSMA
相关产品推荐
相关产品推荐

