20120103 :: [팁] 프로토타입 셀을 서브클래싱하기

프로토타입 셀에 라벨 등의 서브 뷰를 삽입하면 각각의 서브뷰에 tag 값을 주어 -viewWithTag: 메소드를 통해 접근이 가능하다. 하지만 태그를 일일이 외우는 것은 직관적이지 못하므로 (물론 편리하긴하지만) 셀의 하위 구조가 복잡한 경우에는 그닥 즐겨 쓸만한 일이 아니다. 이를 아울렛을 통해 접근하고 제어할 수 있다면 좀 더 편리할 것이다.

이런 경우에는 프로토타입 셀을 서브 클래싱할 수 있다. 즉 UITableViewCell 클래스의 하위 클래스를 만들고 이를 IB에서 명시해주면 된다. 먼저 스토리보드에서 테이블 뷰 안에 있는 프로토타입 셀에 이것 저것 넣고 싶은 레이블이나 이미지뷰등을 넣는다.

원하는 서브 뷰에 대해서는 아울렛 이름을 생각해 본 다음, 다음과 같이 클래스를 하나 추가한다.

//SampleCell.h

@interface SampleCell : UITableViewCell

@property (nonatomic, strong) IBOutlet UILabel *nameLabel;
@property (nonatomic, strong) IBOutlet UILabel *gameLabel;
@property (nonatomic, strong) IBOutlet UIImageView *ratingImageView;
@end

//SampleCell.m

#import “SampleCell.h”
@implemetation SampleCell
@synthesize nameLabel, gameLabel, ratingImageView;
@end

스토리보드(혹은 xib)에서 프로토타입 셀을 선택해 클래스 속성을 SampleCell로 변경한다. 왼쪽 객체 트리구조 리스트에서 셀의 각 하위뷰로 드래그하여 아울렛을 연결해준다. 이 작업이 완료되면 테이블 뷰는 reuse identifier에 대해 sampleCell 의 인스턴스를 반환하게 된다. (이 때, 중요한 것은 테이블뷰 셀에 아울렛을 끌어와야 한다는 점이다. 테이블 뷰나 뷰 컨트롤러에 이를 끌어와서는 곤란하다!!!)

프로토타입 셀의 클래스 이름과 Reuse Identifier 간에는 어떤 상관 관계도 없으므로 같은 이름을 주지 않아도 상관없다.