2017-08-09 10 views
-2

私は、文字列の私の配列を初期化する場所です:私の質問は、私がshopItem[index.row]とどのように印刷しようとすると、なぜ私のアプリのクラッシュがない、あるindexPath.row swift 3を印刷できないのはなぜですか?

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 
} 

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) 

       } 
}) 

これは私のテーブルビューです私はこれを解決するだろうか?

+1

あなたは 'shopItems'自体を印刷して、あなたが探している要素があるかどうか確認しましたか?常に最初のステップは、配列を印刷して、その質問にも共有することです。 – adev

+0

String配列shopItemsには2つの文字列値が含まれています。私は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 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)") 

これは、少なくともあなたの問題を解決するためのすべての重要な値を与えるために起こっています。私が助けてくれることを願って。

関連する問題