2010-01-13 6 views
0

단일 배열의 데이터를 표시하는 테이블이 있고 필터 집합을 기준으로 항목을 별도 섹션으로 구성합니다. 각 필터에는 해당 섹션이 있습니다. 내 UI를 사용하면 각 표 셀에 포함 된 확인란을 탭할 수 있습니다. 이 체크 박스는 항목이 필터링되는 섹션에 영향을주는 "checked"플래그를 설정합니다. 다음은 예입니다 :섹션을 변경하는 셀을 업데이트 할 때 UITableView 충돌이 발생합니다.

  • 제 1
    • 항목 A
    • 항목 B

가 옆에있는 확인란을 누르면 "완료"2

  • 제 항목 A에 표가 재 배열되도록해야합니다. 이 같은

    • 제 1
      • 상품 B
    • 절 "완료"2
      • 항목 A

    다음은 체크 박스 탭에 응답하는 코드입니다. 체크 박스가 속한 행을 확인한 다음 이전 섹션에서 행을 삭제하고 "완료"섹션의 끝에 행을 추가하는 애니메이션 블록을 만들려고합니다. 배열은 실제로 변경되지 않는다는 점에 유의하십시오. 데이터가 섹션으로 필터링되는 방식은 항목의 체크 된 속성 값을 기반으로 변경됩니다.

    2010-01-13 00:19:44.802 MyApp[19923:207] *** Terminating app due to uncaught 
    exception 'NSRangeException', reason: 
    '*** -[NSMutableIndexSet addIndexesInRange:]:Range {2147483647, 1} 
    exceeds maximum index value of NSNotFound - 1' 
    

    사람이 나를 NSRangeException 원인을 알아낼 수 있습니다 :

    - (IBAction)checkBoxTapped:(id)sender 
    { 
    // Get the table cell 
    CheckBoxControl* checkBox = (CheckBoxControl*)sender; 
    
    UITableViewCell* cell = (UITableViewCell*)[[sender superview] superview]; 
    UITableView* table = (UITableView*)[cell superview]; 
    NSIndexPath* indexPath = [table indexPathForCell:cell]; 
    
    Item* item = [self itemAtRow:[indexPath row] inSection:[indexPath section]]; 
    item.checked = checkBox.checked; 
    
    Filter* filter = [filters objectAtIndex:DONE_INDEX]; 
    // We want the new row at the bottom of the "Done" section. 
    NSIndexPath* newIndexPath = [NSIndexPath indexPathForRow:[self countItemsWithFilter:filter] inSection:DONE_INDEX]; 
    
    [table beginUpdates]; 
    [table insertRowsAtIndexPaths:[NSArray arrayWithObject:newIndexPath] withRowAnimation:UITableViewRowAnimationFade]; 
    [table deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade]; 
    [table endUpdates]; 
    } 
    

    이 코드는 항상 예외를 throw? 여기 내 스택입니다 :

    ___TERMINATING_DUE_TO_UNCAUGHT_EXCEPTION___ 
    obj_exception_throw 
    +[NSException raise:format:arguments:] 
    +[NSException raise:format:] 
    -[NSMutableIndexSet addIndexesInRange:] 
    -[NSMutableIndexSet addIndex:] 
    -[_UITableViewUpdateSupport(Private) _computeRowUpdates] 
    -[_UITableViewUpdateSupport initWithTableView:updateItems:oldRowData:oldRowRange:newRowRange:context:] 
    -[UITableView(_UITableViewPrivate) _updateWithItems:withOldRowData:oldRowRange:newRowRange:context:] 
    -[UITableView(_UITableViewPrivate) _endCellAnimationsWithContext:] 
    -[UITableView endUpdates] 
    -[RootViewController checkBoxTapped:] 
    

    이 코드는 내가 한 섹션에서 행을 제거 애니메이션과는 다른 추가하는 방법 다음 그냥 일반 잘못되면?

    도움을 주시면 미리 감사드립니다.

    -Mike-

  • 답변

    1

    좋아, 내가 더 나은 방법을 찾은 것 같습니다. 필터링 기능을 사용하여 섹션을 채우는 대신 각 섹션에 대한 배열을 만들기로 결정했습니다. 각 섹션의 배열에는 데이터 소스 배열에 대한 인덱스가 들어 있습니다.사용자가 체크 박스를 탭하면

    NSArray* data = [[NSArray alloc] initWithObjects:@"Apple", @"Banana", @"Cat", @"Dog", nil]]; 
    NSMutableArray* doneFilter = [[NSMutableArray alloc] init]; 
    NSMutableArray* othersFilter = [[NSMutableArray alloc] initWithObjects:[NSNumber numberWithInt:0], 
               [NSNumber numberWithInt:1], [NSNumber numberWithInt:2], 
               [NSNumber numberWithInt:3], nil]; 
    

    지금, 나는 othersFilter에서 항목의 인덱스를 제거하고 doneFilter의 하단에 추가 : 그것은 다음과 같이 보입니다. 그런 다음 표보기에서 해당 행을 제거하고 추가합니다. 이것은 이전에 가지고 있던 것보다 훨씬 안정적으로 보이고 (예외는 발생하지 않습니다!), 필터가 자신의 순서를 가질 수있는 추가 이점이 있습니다.

    0

    -insertRowsAtIndexPaths를 호출하고 -deleteRowsAtIndexPaths 만 애니메이션 해당 행을 업데이트 할 jQuery과를 말한다. 따라서 가능한 문제는 변경 사항에 따라 데이터 소스를 업데이트해야한다는 것입니다 (예 : -numberOfRowsInSection이 실제 값을 반환해야 함 등).

    +0

    -numberOfRowsInSection을 사용하여 섹션의 필터에 일치하는 항목의 수를 묻습니다. 항목의 "checked"속성은 -insertRowsAtIndexPaths 및 -deleteRowsAtIndexPaths를 호출하기 전에 변경되므로 필터는 각 섹션에 대해 올바른 항목 수를보고합니다. -numberOfRowsInSection에 중단 점을 넣고이를 확인했습니다. 배열이 수정되지 않도록 데이터 소스를 디자인했습니다. 모든 섹션에는 동일한 배열 사본의 항목이 표시되며 필터는 항목의 값에 따라 각 섹션에 표시 할 항목을 결정합니다. 말이 돼? –

    +0

    예,이 방법은 정상적으로 보입니다. 작동합니까? :) – Vladimir

    +0

    아니요. 시도 할 때마다 예외가 발생합니다. 테스트 환경에서 다른 접근법을 시도해보고 범위를 좁힐 수 있는지 확인합니다. –

    관련 문제