RSS

태그 보관물: insertRows

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

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시간이나 삽질을 했나 싶군요. 별 내용이 없지만 혹자에겐 도움이 될까해서 남겨두기로 결정합니다. 😉

 
댓글 11개

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

 

태그: , ,