2017-08-09 199 views
-2

这是我初始化我的字符串数组:为什么我不能打印我的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

您是否尝试过自己打印'shopItems'并查看它是否包含您正在查找的元素?总是第一步是打印阵列,然后在问题中分享。 – adev

+0

String数组shopItems包含两个字符串值。我能够加载到我的tableview,如果我cell.textLabel?.text = self.shopItems([0]或[1]] – user8414724

+0

那么在它崩溃之前'indexPath.row'的值是多少?为什么它会崩溃 – adev

回答

1

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

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)") 

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