iOS - 索引超出范围

时间:2016-08-12 23:52:49

标签: ios swift uitableview

我偶然发现了我的应用程序中的错误:

  

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

我想我可能知道问题是什么,但是,没有关于如何修改错误的线索。

我相信由于我正在使用节标题,这导致了问题。我已经证明了阅读编码以及尝试修复它并在线搜索。下面我发布了我的代码示例(不想包含所有代码,因为它包含几百行代码)。

基本上,我将TableViewController与SWReveal结合使用,用户选择一个选项并显示文本。

class BackTableVC: UITableViewController {


    struct Brands {
      var sectionName : String!
        var sectionBrands : [String]!
    }


    struct ThirdView {
        var ThirdViewArray = [String]()
    }

    var brandArray = [Brands]()



    var ThirdArray = [ThirdView]()

    var brandAnswerArray = [String]()

    override func viewDidLoad() {

        brandArray = [


            Brands(sectionName: "Bugatti", sectionBrands: ["EB 110","Veyron"])]

        ThirdArray = [ThirdView(ThirdViewArray: ["EB 110","Veyron"])]



 }

    override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return  brandArray[section].sectionBrands.count
    }

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

        cell.textLabel?.text = brandArray[indexPath.section].sectionBrands[indexPath.row]

        return cell

    }

    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {

        let DestVC = segue.destinationViewController as! CarDetailsVC

        let indexPath : NSIndexPath = self.tableView.indexPathForSelectedRow!

        let ThirdAnswerArray : ThirdView

        ThirdAnswerArray = ThirdArray[indexPath.row]

        DestVC.brandAnswerArray = ThirdAnswerArray.ThirdViewArray

       DestVC.FirstString = brandAnswerArray[indexPath.row]

    }


    override func numberOfSectionsInTableView(tableView: UITableView) -> Int {
        return brandArray.count
    }

    override func tableView(tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
        return brandArray[section].sectionName

    }


}
    import Foundation

struct ThirdView {
    var ThirdViewArray = [String]()
}

    class CarDetailsVC: UIViewController {


       var FirstString = String()

    var brandAnswerArray = [String]()






    @IBOutlet var Label: UILabel!

    override func viewDidLoad() {

        Label.text = FirstString

    }

        override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
            _ = segue.destinationViewController as! CarDetailsVC            
        }


    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
}


}

我的ThirdView结构和CarDetailsVC位于单独的.swift文件中。

让我悲伤的路线是:

       DestVC.FirstString = brandAnswerArray[indexPath.row]

P.S。如果我这样做:

DestVC.FirstString = "Hello World"

只选择第一个选项时显示Hello World,然后代码/应用程序中断了我在行上得到相同的错误“index out of range”:

        ThirdAnswerArray = ThirdArray[indexPath.row]

1 个答案:

答案 0 :(得分:3)

这个简单的答案是你的brandAnswerArray没有足够的值来为你提供索引indexPath.row的东西。即如果你有一个包含5个值的数组并且你要求它为数组[8],那么应用程序将崩溃,因为索引8不存在。

具体来说,您告诉您的表格您有一定数量的单元格/行:

brandArray [段] .sectionBrands.count

这意味着对于每个整数,从0到任何brandArray [section] .sectionBrands.count,该表将要求您生成一个单元格。因此,这是indexPath.row可以拥有的范围。

但是:在您的prepareForSegue中,您正在访问brandAnswerArray [indexPath.row],而brandAnswerArray根本没有足够的值来为您提供所请求索引的任何内容(这是一种风险,因为您使用了不同的部分构建表的数据)。