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

Posted

技术标签:

【中文标题】致命错误:索引超出范围的 tableview 有两个部分【英文标题】:fatal error: index out of range tableview with two sections 【发布时间】:2016-07-29 01:03:20 【问题描述】:

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

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
        
    

【问题讨论】:

您对UITableViewDataSource 实施的其余部分有什么要求?特别是numberOfRowsInSectionnumberOfSections?这就是cellForRowAtIndexPath 中的indexPath 值的来源。此外,这些部分的索引为零,因此您必须使用 case 0case 1 感谢您的回复!修复了零索引。添加了您要求的部分 【参考方案1】:

您的表格中有两个部分,每个部分来自不同的来源。您需要在 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

【讨论】:

成功了!这种逻辑完全有道理。这是我第一次尝试将来自多个源的数据加载到多个部分。我不知道检查这样的部分是如此容易!再次感谢【参考方案2】:

您的两个数组可能具有不同的大小,因此在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

【讨论】:

以上是关于致命错误:索引超出范围的 tableview 有两个部分的主要内容,如果未能解决你的问题,请参考以下文章

致命错误:TableView 中的数组索引超出范围

致命错误:索引超出范围tableview

重新加载 ViewController 中的 tableview 让我在索引路径的 cellforRow 中出现“致命错误:索引超出范围”

致命错误:索引超出范围的两个自定义单元格

使用致命错误刷新tableview时应用程序崩溃:索引超出范围Swift3

准备转场时致命错误索引超出范围