致命错误:将 FirebaseData 传递给 tablviewCell 时,索引超出范围

Posted

技术标签:

【中文标题】致命错误:将 FirebaseData 传递给 tablviewCell 时,索引超出范围【英文标题】:fatal error: Index out of range, when passing FirebaseData to tablviewCell 【发布时间】:2016-10-18 13:55:28 【问题描述】:

所以我正在处理一个食物列表项目,我想将 mealname/mealpic/mealDescription 从 FirebaseDatabase 传递给我的 tableViewCell。

看起来像这样enter image description here

这是我的 Firebaes 数据库结构

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] 行抛出“索引超出范围”错误

我知道这个索引超出范围错误问题是一种常见问题解答 但我自己做了一些研究,它们并没有真正的帮助

谁能指出可能出了什么问题? 谢谢

更新

现在我成功地将 FirebaseDatabase 中的内容传递到我的 tableview 中。

但我从第 1 天到第 5 天有 5 个节点,但我的表格视图只显示一个(第 3 天)

在我的 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()

所以在打印时 ("SNAP: (snap.key)") 我得到了从第 1 天到第 5 天的所有节点

但在打印(键)时我只得到第 3 天

我认为“if let 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”错误

我想我已经到了那里,我会继续做更多的研究

感谢任何提示

【问题讨论】:

你确定你在menus中有5个项目? 【参考方案1】:

试试看:-

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
    

【讨论】:

嗨德拉威人,感谢您的回复。我试过你的代码,错误消失了。但是我的 tableview 上什么都没有显示...我猜 firebase 中的数据没有传入。你需要我的其他模型文件或视图控制器吗? 所以我按照您的代码成功地在 FirebaseDatebase 中传递了数据, 但它只显示一个单元格,而我在 Firebase 数据库中有 5 个节点......我已经更新了这个问题。我真的不知道问题是什么:( 您确定可以接收所有 5 个节点吗,请尝试打印。 所以我再次更新问题,我想我到了那里

以上是关于致命错误:将 FirebaseData 传递给 tablviewCell 时,索引超出范围的主要内容,如果未能解决你的问题,请参考以下文章

Symfony-Catchable致命错误:传递给Doctrine Common Collections ArrayCollection :: __ construct()的参数1必须是类(代码

致命错误:无法比较属于不同集合的索引:

PHPUnit 显示抛出致命错误异常的传递方法

将无效参数传递给认为无效参数致命的函数

如何将一个查询的结果传递给第二个查询并将结果显示在一个表中?

我们可以将 Func<T,TResult> 传递给 .Net core 5 中的中间件来执行吗?