2016-07-08 11 views
0

사용자가 여러 셀을 선택하여 탭을 선택해야하는 앱을 만들고 있습니다. 셀을 탭하면 .Checkmark 액세서리 항목이 나타납니다. 어떤 이유하지만 나는 시도하고 그 VC에 응용 프로그램 충돌을 얻고 (체크 [indexPath.row] 경우!)가 나는 8 번째 줄에 다음과 같은 오류 메시지를받을 때마다 : Bad Instruction errorindexPath 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

아 ... 좋아요, 그래서'checked'는 행을 체크했는지 여부를 저장하는 배열입니다, 맞습니까? – pbodsk

답변

3

귀하에 문제가 checked 배열에 당신 만 저장 항목 tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath)가 호출 될 때이다 :이 내 작업 확인 방법입니다. 그러나이 메서드는 실제로 행을 선택할 때만 호출됩니다. 반면에 새 테이블 셀을 렌더링해야 할 때마다

tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath)이 호출됩니다.

그래서 cellForRowAtIndexPath에서 당신은 물을 때 :

if !checked[indexPath.row] 

은 다음 checked 실제로 아무것도 포함되어 있는지 확신 할 수 없다. 예를 들어 처음으로 셀 렌더링을 시작할 때 checked 배열에는 값이 없으므로 값이없는 위치에 값을 요청하면 충돌이 발생합니다.

값을 모두 포함하도록 checked 어레이를 초기화 할 수 있습니다. 나는 당신이 어떤 모델 배열이 그래서 당신은 같은 것을 할 수 recipies라고해야 같은데요 :

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

또는 @AaronBrager 아래의 코멘트에서 알 수 있듯이

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

(:) 방법이 더 예뻐이다) 그 방법은 확인한 배열이 recipes와 같은 수의 요소로 올바르게 초기화되었는지 확신합니다.

또 다른 옵션은 recipies의 개별 요소에 검사 여부를 알리는 것입니다.

희망이 있으시면 도움이 될 것입니다.

+0

고마워! 잘 작동했습니다 – zach2161

+2

거짓 값으로 채워진 배열을 시작하려면'checked = Array (count : recipes.count, repeatedValue : false)'를 사용할 수도 있습니다 –

+0

다행히 다음 문제가 발생했습니다. – pbodsk