0

だから私は食事名/食事の写真/食事の説明を FirebaseDatabase から私の tableViewCell に渡したい食品リスト プロジェクトに取り組んでいます。

ここに画像の説明を入力してください

ここに私の FirebaesDatabase 構造があります

ここに画像の説明を入力

そして、これがView Controllerの私のコードです

    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]

この Index out of range error question はよくある質問のようなものですが、自分で調査したところ、あまり役に立ちませんでした

誰かが何が間違っていたのか指摘できますか? ありがとう

アップデート

FirebaseDatabase にあるものをテーブルビューに渡すことに成功しました。

しかし、Day1 から Day5 まで 5 つのノードがありますが、テーブルビューには 1 つしか表示されません (Day3)

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

なぜそれが起こっているのですか?

私のコンテンツのクラスは次のようなものです

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)

}

}

アップデート

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

そのため、print ("SNAP: (snap.key)") で、Day1 から Day5 までのすべてのノードを取得します

しかし、印刷(キー)ではDay3しか得られません

「if let menuDict」ステートメントが問題を引き起こしていると思います

そして、「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()

実行時にクラッシュし、「オプション値のラップ解除中に予期せず nil が見つかりました」というエラーがスローされました

私はそこに着いていると思います、私はもう少し研究を続けます

どんなヒントでも大歓迎です

4

1 に答える 1

0

試す :-

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
                 }
     */
        }
    }
})

そして、あなたを変更してください:-

  func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
      return menus.count ?? 0
    }
于 2016-10-18T13:57:51.617 に答える