2016-07-08 8 views
0

Я делаю приложение, которое требует, чтобы пользователь использовал несколько ячеек, чтобы выбрать их. когда они нажимают на ячейку, появится аксессуар .Checkmark. По какой-то причине, хотя всякий раз, когда я пытаюсь добраться до этого VC сбои приложения, и я получаю следующее сообщение об ошибке на линии 8 (если флажок [indexPath.row]!): Bad Instruction errorИндекс за пределами диапазона для indexPath swift

Index out of range

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


     cell.configurateTheCell(recipies[indexPath.row]) 

     if !checked[indexPath.row] { 
      cell.accessoryType = .None 
     } else if checked[indexPath.row] { 
      cell.accessoryType = .Checkmark 
     } 
     return cell 
    } 

и это мой работает проверил метод:

override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) 
    { 
     tableView.deselectRowAtIndexPath(indexPath, animated: true) 
     if let cell = tableView.cellForRowAtIndexPath(indexPath) { 
      if cell.accessoryType == .Checkmark { 
       cell.accessoryType = .None 
       checked[indexPath.row] = false 
      } else { 
       cell.accessoryType = .Checkmark 
       checked[indexPath.row] = true 
      } 
     } 
    } 
+0

ОК, как выглядит ваш метод 'checked'? – pbodsk

+0

pbodsk Я обновил вопрос, чтобы добавить проверенный метод: – zach2161

+0

ah ... ОК, поэтому 'checked' - это массив, в котором вы храните, проверена ли строка, правильно ли это? – pbodsk

ответ

3

Ваша проблема в том, что вы только магазин пункты в вашем checked массиве, когда tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) называется. Однако этот метод вызывается только тогда, когда вы фактически выбираете строку.

tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) с другой стороны вызывается каждый раз, когда вам нужно визуализировать новую ячейку таблицы.

Так что, когда вы в cellForRowAtIndexPath спрашивает:

if !checked[indexPath.row] 

, то вы не можете быть уверены, что на самом деле checked содержит ничего. Например, при первом запуске рендеринга ваших ячеек ваш массив checked не содержит никаких значений, и поэтому он вылетает, когда вы запрашиваете у него значение в позиции, для которой оно не имеет значения.

Одним из решений может быть инициализация массива checked, содержащего все значения false. Я предполагаю, что у вас есть некоторые модели массив называется recipies, так что вы могли бы сделать что-то вроде:

for (index, _) in recipies.enumerate() { 
    checked.append(false) 
} 

Или, как @AaronBrager предлагает в комментариях ниже (что намного красивее :))

checked = Array(count:recipies.count, repeatedValue:false) 

что вы уверены, что ваш проверочный массив правильно инициализирован с тем же количеством элементов, что и ваши рецепты.

Другой вариант может состоять в том, чтобы отдельные элементы в recipies знали, проверены они или нет.

Надеюсь, это имеет смысл и поможет вам.

+0

Спасибо! Это отлично работает – zach2161

+2

Вы также можете использовать 'checked = Array (count: recipes.count, repeatValue: false)', чтобы запустить массив с заполненными ложными значениями –

+0

Рад, что это сработало, к следующей проблеме, тогда eh :) – pbodsk

Смежные вопросы