为什么我不能打印我的 indexPath.row swift 3?



这是我初始化字符串数组的地方:

let databaseRef = FIRDatabase.database().reference().child("Butikker")                                    
self.shopItems = [String]()                        
databaseRef.observe(FIRDataEventType.value, with: { (snapshot) in
for child in snapshot.children {                 
let snap = child as! FIRDataSnapshot
let dictionary = snap.value as! [String: AnyObject]                   
self.shopItems.append(dictionary["Name"] as! String)
}
})

这是我的表格视图

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
var cell = tableView.dequeueReusableCell(withIdentifier: cellReuseIdentifier, for: indexPath) as UITableViewCell
let when = DispatchTime.now() + 5 
DispatchQueue.main.asyncAfter(deadline: when) {
print(self.shopItems[indexPath.row])
cell.textLabel?.text = self.shopItems[0]
}
return cell
}

我的问题是,为什么我的应用程序在尝试打印shopItem[index.row]时崩溃,我将如何解决这个问题?

我不确定这是否会解决您的问题,但我对您的代码进行了一些基本的改进,这些改进可能会防止您的应用程序通常崩溃。

1.:从Firebase获取快照后,我总是会检查它是否真的存在;你可以通过调用if !snapshot.exists() { return }和在循环if !child.exists() { return }中做到这一点。在 return 语句之前,您可以根据需要实现错误处理。这意味着如果由于任何原因没有可检索的快照,它将停止代码运行。

2.:我总是会用 if-let-语句获取快照值。这也可能是您问题的一部分。只需致电:

if let dictionary = snap.value as? [String:AnyObject] {
// do whatever you want to do if the dictionary can be created
} else { print("For some reason couldn't initialize the dictionary.")}

这还可以防止您的应用程序崩溃(以防万一(,并且可以告诉您它是否找不到所需的值。

3.:不要依赖于异步和延迟地执行cellForRowAtIndexPath((-方法中的代码。如果您的互联网连接不良,该应用程序不太可能需要更多时间来加载并且数据不会出现。相反,在代码的第一部分调用此方法的 for-in-loop 之后:tableView.reloadData() // replace tableView with whatever your tableView is called.这意味着每次有新值时,它都会自动重新加载数据,这样您就不必担心在途中丢失数据。

为了实际解决您所问的问题:显然,indexPath.row 的索引超出了范围,我想我知道为什么:在 numberOfRowsInSection 方法中,您是否根本不调用shopItems.count或者可能不是异步调用? 如果没有,你可以通过调用cellForRowAtIndexPath((-方法来测试它

print("Number of shops items: (shopItems.count); Current index path. (indexPath.row)")

这至少会给你解决问题的所有重要价值。希望我能帮上忙。

最新更新