【发布时间】:2021-03-28 09:42:15
【问题描述】:
我正在尝试从 Firestore 中提取图像数据并通过将图像添加到 tableView 单元格来更新 UI。
但是,我收到 Index out of Range 错误。我相信这是因为时间问题。
你能帮我解决这个问题吗?
提前致谢。
致命错误:索引超出范围:文件 Swift/ContiguousArrayBuffer.swift,第 444 行
override func viewDidLoad() {
super.viewDidLoad()
createBubbleView()
getDataFromFireStore()
detailsTableView.delegate = self
detailsTableView.dataSource = self
// MARK: - NIB REGISTRATION
detailsTableView.register(UINib(nibName: K.ingredientsNibName, bundle: nil), forCellReuseIdentifier: K.ingredientsCell)
detailsTableView.register(UINib(nibName: K.stepsNibName, bundle: nil), forCellReuseIdentifier: K.stepsCell)
detailsTableView.register(UINib(nibName: K.recipeNameNib, bundle: nil), forCellReuseIdentifier: K.recipeNameCell) }
func getDataFromFireStore() {
let db = Firestore.firestore()
for ingredient in ingredients {
db.collection("Ingredients").whereField("name", isEqualTo: ingredient)
.getDocuments() { [self] (querySnapshot, err) in
if let err = err {
print("Error getting documents: \(err)")
} else {
for document in querySnapshot!.documents {
print(document.get("image")!)
if let imageURLsDB = document.get("image") as? [String] {
ingredientsImageURLs.append(document.get("image") as! String)
}
}
}
}
}
// MARK: - RETURNS THE VALUE OF EACH CELL IN THE TABLEVIEW
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = detailsTableView.dequeueReusableCell(withIdentifier: K.ingredientsCell)
switch indexPath.section {
// RECIPE NAME
case 0:
let cell = detailsTableView.dequeueReusableCell(withIdentifier: K.recipeNameCell) as! RecipeTitleCell
cell.cookingTimeLabel.text = cookingTime
cell.numberOfIngredientsLabel.text = String(ingredients.count)
return cell
// INGREDIENTS
case 1:
let cell = detailsTableView.dequeueReusableCell(withIdentifier: K.ingredientsCell) as! IngredientsCell
cell.ingredientName.text = ingredients[indexPath.row]
cell.textLabel?.font = UIFont(name:"Mulish-regular", size:12)
cell.textLabel?.numberOfLines = 0
cell.textLabel?.lineBreakMode = NSLineBreakMode.byWordWrapping
DispatchQueue.main.async {
cell.ingredientImage.sd_setImage(with: URL(string: self.ingredientsImageURLs[indexPath.row]), placeholderImage: UIImage(systemName: "square.and.arrow.up"))
self.detailsTableView.reloadData()
}
return cell
【问题讨论】:
-
你在哪一行得到错误?行计数和节计数方法是什么样的?
ingredients和ingredientsImageURLs数组如何保持同步? -
@JoakimDanielson,当我尝试在成分图像单元格中显示图像时出现错误。您可以看到下面的行; cell.ingredientImage.sd_setImage(with: URL(string: self.ingredientsImageURLs[indexPath.row]), placeholderImage: UIImage(systemName: "square.and.arrow.up"))
-
那么也许你也应该回答我的其他问题。
-
@JoakimDanielson,对不起。请在此处查看屏幕截图-drive.google.com/file/d/1q3md__tZ7tONUsH_e_H6G63SRFUXZQjw/…成分和成分ImageURLs 在firestore 中具有相同数量的元素。但是,当我调试时,我在成分ImageURLs 中看到 0 个元素
-
我的猜测是在getDataFromFireStore函数中下载了部分(或全部)成分ImageURLs中的元素之前调用了发生崩溃的代码。避免这种情况的最佳方法可能是使用一个数组而不是两个数组。
标签: swift uitableview google-cloud-firestore swift5