본문 바로가기

프로그래밍/iOS

[iOS] UITableView section 수정하기(folderable)

디자인 시안 중 접기/펼치기가 가능한 UI가 있어 section부분이 터치가 가능해야 했다.

일단 기본적으론 지원하지 않기 때문에 오픈소스 찾아보려 했지만

코드보기가 몹시 귀찮은 관계로 쉬운 방법을 찾다보니...

view를 만들어 section을 대체할 수 있어 그 방법으로 도전

간단하게 UITableViewCell을 끌어와서 label하나와 버튼 하나를 배치

Id를 SectionCell이라 명명

이 부분은 마음가는대로 해도 될듯

이제 storyboard에서 만든 section을 사용하려면 UITableViewDelegate함수인 tableView:viewForHeaderInSection:함수에 아래와 같이 기술하면 된다.

- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section

{

    static NSString *HeaderCellIdentifier = @"SectionCell"; // cell id

    

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:HeaderCellIdentifier]; // cell id를 가진 cell을 재사용

    if (cell == nil) { // cell이 nil일 경우 초기화

        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:HeaderCellIdentifier]; 

    }

    return cell; // cell 반환

}

만약 cell안의 뷰들을 가져오고 싶은경우 storyboard에서 해당 control에 tag를 붙인후 아래와 같이 태그로 받아올 수 있다.

UILabel* sectionLabel = [cell viewWithTag:1005];


버튼은 ViewController와 연결한 후 (Assistant Editor를 킨채 button을 control누른채로 클릭하여 코드 쪽으로 옮기면 함수가 만들어진다.) 함수에 아래와 같이 기술한다.

- (IBAction)folderButtonClicked:(UIButton*)button

{

    self.isClosed = !self.isClosed;  // 현재 닫혀있는지 상태변수를 변경(BOOL변수)

    [self.tableView reloadData]; // 테이블 뷰를 다시 로드

}

그러면 버튼을 클릭 시 현재 상태가 닫혀있음/닫혀있지 않음 2가지 상태가 존재한다.

이 때 UITableViewDelegate함수인 tableView:numberOfRowsInSection: 함수에서 row수를 조절해주면 접기/펼치기가 가능한 테이블 뷰를 만들 수 있다.

코드는 아래와 같다.

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section;

{

    if (self.isClosed)

    {

        return 0; // 닫혀 있는 상태니깐 0개

    }

    else

    {

        return self.dataArray.count; // 열려 있는 상태니깐 데이터의 갯수만큼 리턴

    }

}