RSS

UITableView에서 동적으로 Row나 Section추가하기

04 3월

iOS 개발을 하면서 가장 많이 접하게 되는 UI를 꼽으라면 테이블뷰를 언급하는 개발자들을 많이 접했습니다. 테이블 뷰의 ‘유연함’과 ‘성능’에서 탁월하기 때문일테죠. 오늘도 테이블 뷰와 2시간 넘게 씨름해서 얻게 된 중요한 교훈을 나눠볼까 합니다.

오늘 고민했던 부분은 테이블 뷰의 섹션이 동적으로 추가되거나 삭제되어야 하는 케이스 때문인데요. 네트워크로 내려받은 데이터의 조건에 따라 0번째 섹션이 추가되거나 제거되어 하는 경우죠.

이 경우 고려해야 할 것이 몇 가지가 됩니다. 첫째, 테이블 뷰의 섹션의 개수가 내가 추가 또는 삭제한 이후의 섹션 개수와 일치해야 합니다. 둘째, 각 셀을 그려줄 때에도 추가된 섹션의 행(rows)에 어떤 cell이 그려줘야 하는 지 정의되어 있어야 합니다. 셋째, 셀/섹션을 추가하거나 삭제하는 멤버함수 위아래로 beginUpdates와 endUpdates를 걸어줘야 합니다.

- (IBAction) addCell {
	if (self.tableView.numberOfSections > 0) {
		NSMutableArray* innerList = [cellDataList objectAtIndex:0];
		[innerList insertObject:@"a new cell" atIndex:0];

		[self.tableView beginUpdates];
		[self.tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:[NSIndexPath indexPathForRow:0 inSection:0]]
							  withRowAnimation:UITableViewRowAnimationBottom];
		[self.tableView endUpdates];
	}
}

- (IBAction) addSection {
	if (self.tableView.numberOfSections > 0) {
		NSMutableArray* innerList = [NSMutableArray arrayWithCapacity:5];
		for (int i = 0; i < 5; i++) {
			[innerList addObject:@"a new section's cell"];
		}
		[cellDataList insertObject:innerList atIndex:0];
		[self.tableView beginUpdates];
		[self.tableView insertSections:[NSIndexSet indexSetWithIndex:0]
					  withRowAnimation:UITableViewRowAnimationBottom];
		[self.tableView endUpdates];
	}
}

예제 파일을 만들어 봤습니다. sample 다운로드

좌측 버튼을 누르면 첫째 섹션의 첫째 행에  row가 하나 추가 됩니다.  우측버튼은 첫째 섹션 앞에 섹션을 추가합니다.

에필로그 – 써놓고 보니 이걸 왜 2시간이나 삽질을 했나 싶군요. 별 내용이 없지만 혹자에겐 도움이 될까해서 남겨두기로 결정합니다. 😉

Advertisements
 
댓글 11개

게시자: 켬 2011년 3월 4일 in iOS개발

 

태그: , ,

UITableView에서 동적으로 Row나 Section추가하기”에 대한 11개의 응답

  1. Park SoonDong

    2011년 6월 25일 at 11:25 오후

    간단한 것도 정리하기는데는 시간이 걸리죠.
    많은 도움이 됐습니다.

     
    • 최피디

      2011년 6월 26일 at 12:38 오전

      그렇게 여겨주시니 감사합니다.:-)

       
  2. 렘군

    2011년 6월 30일 at 6:07 오후

    소중한 자료 감사합니다 잘 보구 가여

     
    • 최피디

      2011년 6월 30일 at 6:34 오후

      좋게 봐주시니 감사합니다. 🙂

       
  3. 권혁민

    2012년 3월 28일 at 4:06 오후

    혹시 삭제하는 함수도 구현하셨나요? 계속 오류가 나서 ㅠㅠ

     
    • 최피디

      2012년 4월 10일 at 2:03 오후

      해결하셨나요? 대부분 오류는 경험상 array count와 index가 꼬여 생기는 경우였습니다.

       
  4. 김영칠

    2013년 1월 16일 at 9:47 오전

    진짜 잘몰라서 그런데 그냥
    [tableview reloadData];
    로 해도 되지 않나요? 어떤게 다른지 잘 몰라서 좀 물어볼께요 ^^;;

     
    • 최피디

      2013년 1월 21일 at 6:17 오후

      네, reloadData하면, 전체가 갱신되지요. 열 하나에 대해서만 바꾸고 싶을 때 이용하게 됩니다. 왜쓰냐면, 더 적은 비용이 들어서에요.

       
  5. windows

    2013년 9월 3일 at 6:58 오후

    잘보고갑시더… 최피디씨 정말 감사합니다.

     
  6. SuperDG

    2013년 11월 24일 at 6:40 오전

    일단 포스팅이 있다니 감사합니다. 소스만 보고 적용해 보았는데 안되네요ㅠ
    그래서 샘플코드를 받고 싶은데요 다운이 되질 않는군요ㅠ 혹시 샘플코드를 받을수 있을까요?
    daegeun21@gmail.com 요기로 부탁드리겠습니다. 감사합니다~

     
    • 최피디

      2013년 12월 8일 at 11:06 오후

      저런 그 샘플 코드를 github에서 제가 실수로 지워버렸나 봅니다. 저도 갖고 있는게 없네요. ^^;

       

답글 남기기

아래 항목을 채우거나 오른쪽 아이콘 중 하나를 클릭하여 로그 인 하세요:

WordPress.com 로고

WordPress.com의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

Twitter 사진

Twitter의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

Facebook 사진

Facebook의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

Google+ photo

Google+의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

%s에 연결하는 중

 
%d 블로거가 이것을 좋아합니다: