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

Posted

技术标签:

【中文标题】致命错误:TableView 中的数组索引超出范围【英文标题】:fatal error: Array index out of range in TableView 【发布时间】:2016-02-13 20:29:15 【问题描述】:

您好,我有一个动态原型 TableView。我添加了 4 个原型单元。三是静态的,一是动态的。问题是我得到 Array index out of range 错误。你能检查一下出了什么问题吗?我应该分配的总行数应该是多少

let NUMBER_OF_STATIC_CELLS = 3
var labels = ["label1","label2","label3"]

override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int 


    return labels.count+NUMBER_OF_STATIC_CELLS





override func numberOfSectionsInTableView(tableView: UITableView) -> Int 
    return 1

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell 



    var cell:  TestViewCell!

    print(indexPath.row)
    if (indexPath.row == 0) 
        cell = tableView.dequeueReusableCellWithIdentifier("static1", forIndexPath: indexPath) as! TestViewCell


    

    if (indexPath.row == 1) 
            cell = tableView.dequeueReusableCellWithIdentifier("static2", forIndexPath: indexPath) as! TestViewCell
        //cell.cardSetName?.text = self.cardSetObject["name"] as String
        

     if (indexPath.row == 2) 
            cell = tableView.dequeueReusableCellWithIdentifier("static3", forIndexPath: indexPath) as! TestViewCell
            //cell.cardSetName?.text = self.cardSetObject["name"] as String
        




      if (indexPath.row >= 3) 

        cell = tableView.dequeueReusableCellWithIdentifier("cell", forIndexPath: indexPath) as! TestViewCell
        cell.testLabel.text = labels[indexPath.row] // return test rows as set in numberOfRowsInSection
    

    return cell;
   

【问题讨论】:

仅供参考,Apple 在他们的 Swift 文档中注释常量应该反转骆驼大小写.....不是全部大写。这真的只是一个 C 的东西:/。为您的行检查使用 switch case,这将清理您的代码.. 很多。 仍然损坏,更新后的逻辑正在尝试访问超出范围的索引 3,4 和 5。试试labels[indexPath.row - NUMBER_OF_STATIC_CELLS]。同时更改>= 3 to >= NUMBER_OF_STATIC_CELLS。还有@TheCodingArt 所说的关于常量大小写的内容 另外,我强烈建议您付出更多努力以保持缩进一致 - 如果不这样做,您只会让自己更难 - 您所有的 if 都应该缩进同一级别 - 对于扫描您的代码的人来说,看起来您已经嵌套了 ifs,而您却没有 @RichTolley 好的谢谢它的工作。你能发表你的评论作为答案吗 您应该接受并支持 @JulianKról 的回答 - 他的建议包含了我错过的 if 声明的详细信息 【参考方案1】:

您已将单元格数设置为 6,并且在标签数组中您只有 3 个元素。此外,在每个条件下,您都分配给单元格,但在方法结束时,您将覆盖该分配,这(我想)不是您的意图。然后您尝试访问超出范围的索引下的元素

【讨论】:

对不起,我更新了我的问题。请看一下 还是同样的问题。在最后一个条件中,您正在访问只有 3 个元素的数组中索引 3、4... 处的元素。这就是您的应用程序崩溃的原因。放置断点并检查值,您会发现问题 那我该怎么办?好吧,我有三个静态单元格,其余单元格将是动态的。所以意思是第四个。请你告诉我应该定义多少行。 看起来您希望在最后一个条件中具有 indexPath.row =3 并访问标签等标签[indexPath.row - NUMBER_OF_STATIC_CELLS]跨度> 无论如何你应该开始自己调试你的代码:)【参考方案2】:

这是你的错误!您没有索引高于 2 的标签。下面的行尝试对标签 [3] 等进行操作。

cell.testLabel.text = labels[indexPath.row]

【讨论】:

以上是关于致命错误:TableView 中的数组索引超出范围的主要内容,如果未能解决你的问题,请参考以下文章

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

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

Swift TableView ImageView + Label = 致命错误:索引超出范围

(Swift) 致命错误:索引超出范围

致命错误:numberOfRowsInSection 中的索引超出范围

致命错误:索引超出范围