2016-07-08 23 views
0

私は、ユーザーが複数のセルをタップして選択する必要があるアプリケーションを作っています。セルをタップすると、.Checkmarkのアクセサリーアイテムが表示されます。何らかの理由しかし、私は試してみて、そのVCにアプリがクラッシュを取得し、(チェック[indexPath.row]場合!)が、私は8行目に次のエラーメッセージを取得するたび:Bad Instruction errorindexpathの範囲外のインデックス

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

OK、あなたの 'checked'メソッドはどのように見えますか? – pbodsk

+0

pbodskチェックされたメソッドを追加する質問が更新されました:) – zach2161

+0

ah ... OKですので、 '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値に初期化することが1つの解決策でした。その

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

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

それとも@AaronBragerは(:)方法きれいである)以下のコメントで示唆として:私はあなたには、いくつかのモデル配列は非常にあなたのような何かができるrecipiesと呼ばれてい推測していますチェック配列がレシピと同じ数の要素で適切に初期化されていることを確認してください。

別の方法として、recipiesの個々の要素にチェックを付けるかどうかを知らせることもできます。

これは理にかなっています。

+0

になります。ありがとう!うまくいきました – zach2161

+2

'checked = Array(count:recipes.count、repeatedValue:false)'を使って配列を開始し、false値でいっぱいにすることができます –

+0

うまくいってくれてうれしく思っています。 – pbodsk

関連する問題