본문 바로가기

smells digital

[IPhone] 테이블의 셀 가지고 놀기

테이블의 한 열을 선택하면 선택된 열은 다른 셀이 나오게 하는 방법이다.

Table에 내용을 표시하기 위해서는 TableDataSource의 Delegation의 메소드를 작성해야 한다.

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath


이 메소드는 테이블의 각 셀을 반환하는 메소드이다.


여기서 테이블의 셀이 선택되었는지를 비교해야한다. 즉 인수로 넘어온 index와 테이블에 선택된 index가 같으면 선택되었을때의 셀을 반환하면 되고 아니면 보통의 셀을 반환하면 된다.

if (indexPath == [tableView indexPathForSelectedRow]) {
    return SelectedCell;
} else {
    return NormalCell;
}

이것만으로는 부족하다. 왜냐하면 화면에 테이블이 나오는 시점은 모든 셀을 그려버린 상태이기 때문이다. 그러면 셀을 선택한 순간에 선택한 셀을 다시 그려주면 된다.


셀을 선택하면 UITableViewDelegate의 didSelectRowAtIndexPath 메소드가 호출된다.

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath


이 곳에서 셀을 다시 그리라고 아래의 메소드를 호출한다.


- (void)reloadRowsAtIndexPaths:(NSArray *)indexPaths   withRowAnimation:(UITableViewRowAnimation)animation


indexPaths는 indexPath의 배열이다. 즉 다수의 셀을 한번에 그릴수 있다.


두번째 인자는 에니메이션 효과이다.

   UITableViewRowAnimationFade
   UITableViewRowAnimationRight
   UITableViewRowAnimationLeft
   UITableViewRowAnimationTop
   UITableViewRowAnimationBottom
   UITableViewRowAnimationNone


그러면 테이블의 셀을 선택하면 didSelectRowAtIndexPath가 호출되고 이곳에서 reloadRowsAtIndexPaths메소드를 이용하여 셀을 다시 그리게끔 한다.




끝인가? 아니다.


다른 셀을 선택하게되면 새롭게 선택한 셀을 다시 그리지만 선택되었던 셀을 다시 그릴수 없다. 그래서 아마도 하얗게(혹은 배경색으로) 변할 것이다.


이를 위해서 다른 셀을 선택할때 기존에 선택된(포커스를 잃어버리게 되는) 셀도 다시 그려줘야 한다. 


-(void)tableView:(UITableView *)tableView didDeselectRowAtIndexPath:(NSIndexPath *)indexPath


위의 메소드가 선택되었다가 선택되지 않은 상태가 될때(Deselect) 호출되는 메소드이다. 여기서도 위의 reload메소드를 이용하여 다시 그려준다.



하나더!


만약에 셀의 크기가 다르다면? 즉 높이가 다르다면..


- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath


셀의 높이를 반환하는 메소드이다. 여기서 셀이 선택되었는지 아닌지를 비교해서 높이를 반환하면 된다.






반응형