Work/iOS

UITableView에서 셀 삭제할 때 'Invalid update: invalid number of sections. ... 에러 대처법

kevin. 2010. 9. 3. 13:13
UITableView에서 셀 삭제를 구현할 때 기본적으로 아래와 같은 코드를 사용합니다.
 
 - (void)tableViewUITableView *)tableView commitEditingStyleUITableViewCellEditingStyle)ed itingStyle forRowAtIndexPathNSIndexPath *)indexPath {
    if (editingStyle == UITableViewCellEditingStyleDelete) {
        [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath]withRowAnimation:UITableViewRowAnimationFade];
    }
}

이렇게만 해놓으면 아래와 같은 에러가 발생됩니다.

'Invalid update: invalid number of sections. The number of sections contained in the table view after the update (0) must be equal to the number of sections contained in the table view before the update (1), plus or minus the number of sections inserted or deleted (0 inserted, 0 deleted).'

그 이유는 UITableView에서 delete를 하고 난 다음에는 reloadData로 인해 numberOfRowsInSection을 호출하기 때문입니다.
numberOfRowsInSection에서는 아시다시피 section 당 row 수를 뿌려주는데, 이 수가 맞지 않기 때문이죠..

따라서 아래와 같이 코딩해 주어야 합니다.

 
 - (void)tableViewUITableView *)tableView commitEditingStyleUITableViewCellEditingStyle)ed itingStyle forRowAtIndexPathNSIndexPath *)indexPath {
    if (editingStyle == UITableViewCellEditingStyleDelete) {
        [데이터 소스 removeObjectAtIndex:indexPath.row]; // 먼저 셀에서 빼줌.
        [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath]withRowAnimation:UITableViewRowAnimationFade];
    }
}
즉, 먼저 데이터 소스에서 제거하고 테이블에서 제거시키자! 간단하죠~?