2017-08-09 242 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)") 

這至少要給你解決你的問題的所有重要的價值。希望我能幫上忙。