2016-08-12 5 views
1

Я наткнулся на ошибку в моем приложении:IOS - Index Out Of Range

fatal error: Index out of range (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. 
} 


} 

My ThirdView struct и CarDetailsVC находятся в отдельных файлах .swift.

линия, которая дает мне горе:

 DestVC.FirstString = brandAnswerArray[indexPath.row] 

P.S. если бы я должен был сделать это:

DestVC.FirstString = "Hello World" 

Hello World отображается при выборе только первый вариант, то код/​​приложение разбивает я получаю один и тот же «индекс вне диапазона» ошибка на линии:

 ThirdAnswerArray = ThirdArray[indexPath.row] 

ответ

3

Этот простой ответ заключается в том, что ваш брендAnswerArray не имеет достаточных значений, чтобы дать вам вещь в index indexPath.row. т. е. если у вас есть массив с 5 значениями и вы запрашиваете его для массива [8], приложение выйдет из строя, потому что индекс 8 не существует.

В частности, вы говорите столики, что у вас есть определенное количество клеток/строк:

brandArray [раздел] .sectionBrands.count

Это означает, что для любого целого числа от 0, к какому бы то ни brandArray [section] .sectionBrands.count, в таблице будет предложено создать ячейку. Таким образом, это диапазон, который может иметь ваш indexPath.row.

НО: В вашей готовой форме вы получаете доступ к брендуAndswerArray [indexPath.row], а brandAnswerArray просто не имеет достаточных значений, чтобы дать вам все, что есть в запрошенном индексе (что является риском, поскольку вы использовали другую порцию данных для построения таблицы).

+0

Я понимаю, что вы говорите, однако мой ThirdArray состоит из двух значений и есть две ячейки. Разве этого недостаточно? Ну, я знаю, что ответ из-за приложения продолжает рушиться. Как назначить значения для brandAnswerArray? Что было бы лучше всего? – TheNoviceProgrammer