致命错误:索引超出范围tableview有两个部分

时间:2016-07-29 01:03:21

标签: ios swift uitableview firebase firebase-realtime-database

我正在尝试使用两个Firebase对象阵列(称为快照)填充包含2个部分的tableView。当我尝试加载tableView:fatal error: Index out of range时,我的cellForRowAtIndexPath函数出错了。

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCellWithIdentifier("PersonCell", forIndexPath: indexPath) as! PersonCell

  //set cell text
  let guardianDict = guardians[indexPath.row].value as! [String : AnyObject] // error happens here
  let dependentDict = dependents[indexPath.row].value as! [String : AnyObject]

  cell.personName.text = "test"

  return cell
}

以下是我定义各个部分的方法:

override func tableView(tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
        switch(section){
            case 0: return "Dependents"

            case 1: return "Guardians"

        default: return ""
        }
    }

有什么想法吗? 谢谢!

编辑:添加numberOfSections和numberOfRowsInSection:

override func numberOfSectionsInTableView(tableView: UITableView) -> Int {
        // #warning Incomplete implementation, return the number of sections
        return 2
    }

    override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        // #warning Incomplete implementation, return the number of rows
        switch(section){
        case 0: return self.dependents.count

        case 1: return self.guardians.count

        default: return 1
        }
    }

2 个答案:

答案 0 :(得分:2)

您的表格中有两个部分,每个部分来自不同的来源。您需要在cellForRowIndexPath函数中添加检查才能访问正确的数组:

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
  let cell = tableView.dequeueReusableCellWithIdentifier("PersonCell",    forIndexPath: indexPath) as! PersonCell

  if indexPath.section == 0
  {
    let dependentDict = dependents[indexPath.row].value as! [String : AnyObject]
  }
  else if indexPath.section == 1
  {
    let guardianDict = guardians[indexPath.row].value as! [String :  AnyObject] // error happens here
  }
  cell.personName.text = "test"

  return cell
}

答案 1 :(得分:0)

您的两个数组可能大小不同,因此在cellForRowAtIndexPath中,您需要检查要返回单元格的哪个部分,并且只能访问相应的数组。目前,每次调用此函数时都要访问这两个数组,当其中一个数组小于另一个数组时,会导致索引超出范围异常。

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCellWithIdentifier("PersonCell", forIndexPath: indexPath) as! PersonCell

    if indexPath.section == 0 {
        let dependentDict = dependents[indexPath.row].value as! [String : AnyObject]
        cell.personName.text = dependentDict["name"] as! String //Or whatever element in the dictionary is needed
    } else {
        let guardianDict = guardians[indexPath.row].value as! [String : AnyObject] 
        cell.personName.text = guardianDict["name"] as! String //Or whatever element in the dictionary is needed
    }

    return cell
}