2016-10-18 5 views
0

したがって、私はmealname/mealpic/mealDescriptionをFirebaseDatabaseからtableViewCellに渡したいフードリストプロジェクトを行っています。致命的なエラー:FirebaseDataをtablviewCellに渡すときにインデックスが範囲外になる

それが何かは、このenter image description here

のように見えますここに私のFirebaesDatabase構造が

enter image description here

だとここに私のコードは、ビューコントローラに

override func viewDidLoad() { 
    super.viewDidLoad() 

    WeekMenu.delegate = self 
    WeekMenu.dataSource = self 

    let url = GIDSignIn.sharedInstance().currentUser.profile.imageURL(withDimension: 100) 
    let data = try? Data(contentsOf: url!) 
    userpic.image = UIImage(data:data!) 



    DataService.ds.REF_MENUDATA.observe(.value, with: { (snapshot) in 
     if let snapshot = snapshot.children.allObjects as? [FIRDataSnapshot] 

     { 
      for snap in snapshot { 
       print("SNAP: \(snap)") 
       if let menuDict = snap.value as? Dictionary<String, AnyObject> { 
        let date = snap.key 
        let menu = menuContnet(weekmenudate: date, menuData: menuDict as! Dictionary<String, String>) 
        self.menus.append(menu) 
       } 
      } 
     } 
    }) 
    self.WeekMenu.reloadData() 
} 
func numberOfSections(in tableView: UITableView) -> Int { 
    return 1 
} 

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
    return 5 
} 

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
    let menu = menus [indexPath.row] 
    if let cell: WeekMenu = tableView.dequeueReusableCell(withIdentifier: "WeekMenu") as! WeekMenu { 
    cell.configureCell(menu: menu) 
    return cell 
    } 
} 

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { 
    performSegue(withIdentifier: "ToVari", sender: nil) 
    } 

だそれは、実行時にクラッシュしてスローされます行の「範囲外のインデックス」エラーlet menu = menus [indexPath.row]

私は範囲エラーの質問のうち、このインデックスを知っては、よくある質問 の一種であるが、私はいくつかは、自分自身を研究なかったし、彼らは本当に

は、誰もが、おそらく間違っていたかもしれないものを指摘する可能性が助けていませんか? おかげ

UPDATE

は、今私は正常私は私のテーブルビューにFirebaseDatabaseに持っているものを渡します。

が、私はDay5に1日目から5つのノードを持っていますが、私のテーブルビューは

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return menus.count }

がなぜ起こっていることに一つだけ(3日目)を示しますか? (スナップ:コンテンツの

私のクラスはとてもプリント(「SNAPで次の

class menuContnet { 


private var _menuKey: String! 
private var _mealDes : String! 
private var _mealPic : String! 
private var _mealname : String! 
private var _menuRef: FIRDatabaseReference! 


var menuKey: String{ 
    return _menuKey 
} 

var mealDes : String { 
    return _mealDes 
} 

var mealname : String { 
    return _mealname 
} 

var mealPic : String { 
    return _mealPic 
} 

init (mealDes: String, mealname: String, mealPic: String) { 
    self._mealDes = mealDes 
    self._mealname = mealname 
    self._mealPic = mealPic 
} 

init (menuKey: String, menuData : Dictionary <String, String>) { 
    self._menuKey = menuKey 

    if let mealname = menuData["mealname"] { 
     self._mealname = mealname 
    } 

    if let mealPic = menuData["mealPic"] { 
     self._mealPic = mealPic 
    } 

    if let mealDes = menuData["mealDes"] { 
     self._mealDes = mealDes 
    } 

    _menuRef = DataService.ds.REF_MENUS.child(_menuKey) 

} 

}

UPDATE

if let snapshot = snapshot.children.allObjects as? [FIRDataSnapshot]    
     { 
      for snap in snapshot { 

       print ("SNAP: \(snap.key)") 

       if let menuDict = snap.value as? Dictionary<String, String> { 
        let key = snap.key 
        let menu = menuContnet(menuKey: key, menuData: menuDict) 
        print (key) 
        self.menus.append(menu) 

        self.WeekMenu.reloadData() 

のようなものです。キー)」)私は、1日目から5日目

にすべてのノードを取得しますが)(プリントキーで私は考えるだけで3日目

を得る 『menuDictは』文は問題に

を引き起こし、場合させた場合私は、私は「もし」と私のコードは、この

    let menuDict = snap.value as? Dictionary<String, String> 
        let key = snap.key 
        let menu = menuContnet(menuKey: key, menuData: menuDict) 
        print (key) 
        self.menus.append(menu) 

        self.WeekMenu.reloadData() 

のように見えるように、それは

「オプションの値をアンラップしながら、予想外にnilを見つけ、」エラーを投げて、実行時にクラッシュして取り除きます

DataService.ds.REF_MENUDATA.observe(.value, with: { (snapshot) in 
    if let snapshot = snapshot.children.allObjects as? [FIRDataSnapshot] 

    { 
     for snap in snapshot { 
      print("SNAP: \(snap)") 
      if let menuDict = snap.value as? Dictionary<String, AnyObject> { 
       let date = snap.key 
       let menu = menuContnet(weekmenudate: date, menuData: menuDict as! Dictionary<String, String>) 
       self.menus.append(menu) 
       self.WeekMenu.reloadData() // This will reload your table to show your newly appended cell one at a time. 
      } 
    /* 

      if menus.count == snap.childrenCount { 
       self.WeekMenu.reloadData()  //Will only reload your table after your entire requested database has been retrieved 
       } 
    */ 
     } 
    } 
}) 

そして、あなたの変更: - - :私は任意のヒントが

+0

そのuは必ずあなたは 'メニュー 'に5つのアイテムを持っていますか? –

答えて

0

試しを高く評価しているいくつかのより多くの研究

をやり続けるだろう、私はそこにきていると思う

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
     return menus.count ?? 0 
    } 
+0

こんにちはドラビディアン、返信ありがとうございます。私はあなたのコードを試して、エラーが消え去る。しかし、私のテーブルビューには何も表示されません... firebaseのデータが渡されなかったと思います。私の他のModelファイルやView Controllerが必要ですか? – Ian

+0

FirebaseDatebaseのコードに従ってデータを正常に渡します。 – Ian

+0

ですが、Firebaseデータベースに5つのノードがある間に1つのセルしか表示されません....私は質問を更新しました。私は実際に問題が何かを知っていません:( – Ian

関連する問題