2011년 2월 25일 금요일

[iOS/Three20] TTTableViewController 의 기본

TTTableViewController는 UITableView와 UITableViewDelegate를 합쳐놓은 듯한 콘트롤러다.

기본 작동 메커니즘은 UITableView와 거의 동일할 거라 생각된다. 하지만 이 중 UITableviewDelegate를 통해 데이터를 전달하는 프로토콜을 내부에서 구현하고 있기 때문에 프로그래머는 Table Cell을 만들어서 데이터 소스에 넣어주기만 하면 테이블을 구현할 수 있게 된다.

실제 구현은 TTTableViewController를 상속받은 클래스에서 initWithNibName을 구현하는 것으로 시작한다.

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil {
    ...
}

이 내부에서 데이터 소스를 바로 만들어 주면 화면에 뭔가 보인다.

...

너무 간단해!! 으악!! iOS SDK 만으로 테이블을 만들어 본 사람이라면 이 단순함을 알 수 있을 것이다.

TTCatalog의 테이블 샘플 중 하나인 TableImageTestController.m을 보면 그 예를 볼 수 있다.

- (TTTableImageItem*)itemForURL:(NSString*)URL {

    return [TTTableSubtitleItem itemWithText:@"text" 
                                    subtitle:nil 
                                    imageURL:URL
                                defaultImage:TTIMAGE(@"bundle://기본사진.png")
                                         URL:nil 
                                accessoryURL:nil];
}

- (id)initWithNibName:(NSString *)nibNameOrNil 
               bundle:(NSBundle *)nibBundleOrNil {

    if (self = [super initWithNibName:nibNameOrNil 
                               bundle:nibBundleOrNil]) {
        self.dataSource = [TTListDataSource dataSourceWithObjects:
            [self itemForURL:@"http://어딘가의이미지1.jpg"],
            [self itemForURL:@"http://어딘가의이미지2.jpg"],
            // ...
            [self itemForURL:@"http://어딘가의이미지n.jpg"],
            nil];
    }
    return self;
}

- (void)loadView {
    [super loadView];
    self.tableView.rowHeight = 90;
}

소스가 뚱뚱하고 길어서 몇 부분은 좀 편집했지만 거의 원형 그대로다. 그냥 initWithNibName에서 데이터소스에 해당하는 self.dataSource에 셀(TTTableSubtitleItem)을 넣어주는 것 만으로 테이블이 완성된다. loadView라는 부분도 있지만 그다지 주의해서 볼 만한 건 아닌 듯 하다.

실제로 제대로 된 테이블을 만드려면 Data Source와 Model을 따로 구현하는게 좋다. 샘플의 TTTwitter라는 좋은 예제가 있으니 참고할 것.

댓글 없음 :