为什么我不能打印我的indexPath.row swift 3?
这是我初始化我的字符串数组:为什么我不能打印我的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)
}
})
这是我的tableview:
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 }
和for-in-loop if !child.exists() { return }
来实现。如果您愿意,可以在return语句之前实现错误处理。这意味着如果由于任何原因没有快照可检索,它将停止运行代码。
2 .:我总是用if-let-statement获取快照值。这也可能是你的问题的一部分。只需拨打:
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)")
这至少要给你解决你的问题的所有重要的价值。希望我能帮上忙。
您是否尝试过自己打印'shopItems'并查看它是否包含您正在查找的元素?总是第一步是打印阵列,然后在问题中分享。 – adev
String数组shopItems包含两个字符串值。我能够加载到我的tableview,如果我cell.textLabel?.text = self.shopItems([0]或[1]] – user8414724
那么在它崩溃之前'indexPath.row'的值是多少?为什么它会崩溃 – adev