2011-08-22 6 views
13

일부 텍스트와 일부 이미지가 포함될 Nav 컨트롤러의 계층 구조 중 하나에 UIViewController를로드하고 있습니다. 맨 아래에서 확장 가능하고 접을 수있는 테이블 뷰를 작성하려고합니다.UITableView를 프로그래밍 방식으로 UIViewController에 추가

먼저이 아이디어가 가능합니까? 그렇다면 어떻게 추가하고 데이터 소스를 배치하고 메서드를 위임합니까?

TableViewController의 별도 하위 클래스를 만든 다음이를 내 ViewController에 하위보기로 추가 할 수 있습니까?

+0

보기 컨트롤러가보기가 아니고보기에만 하위보기가 있기 때문에보기 컨트롤러에 아무 것도 추가 할 수 없습니다. –

답변

20

예, 위임자, 데이터 소스 및 상위보기가 반드시 UITableViewController가 아닌 UITableView를 만들 수 있습니다. UITableView는 UIView이므로 다른 UIView의 하위보기로 추가 할 수 있습니다. NSObject는 필요한 프로토콜 메소드를 구현하는 한 위임자 또는 데이터 소스가 될 수 있습니다.

@interface MyViewController : UIViewController <UITableViewDelegate, UITableViewDataSource> 

사실, 제 경험상 많은 사람들이 UITableViewController를 사용하지 않습니다. 마지막으로 테이블 뷰가 사용 가능한 전체 공간을 차지하기를 원하는 시점은 언제입니까? 일반적으로 평범한 이전 UIViewController를 만들고 다른 하위 뷰 외에도 뷰의 하위 뷰인 UITableView를 추가합니다.

+0

안녕하세요, @commanda, ios 개발에 익숙하며, 다른 객체가있는 uiviewcontroller에 uitableview를 삽입하는 방법을 제대로 구현하는 방법을 찾고 있습니다. 어쨌든, 나는 이것에 비틀 거리고 어떻게 볼 수있는 자습서/소스 코드를 알 수 있는지 궁금 해서요 어떻게 작동하는지 이해할 수 있습니까? 감사! – gdubs

11

그것은 당신의 viewDidLoad 방법과 같은에서, 꽤 쉽게 :

UITableView *tableView = [[UITableView alloc] initWithFrame:self.view.bounds]; 
[self.view addSubview:tableView]; 
4

은 그냥있는 UITableViewController는 컨트롤러의보기로 설정되어있는 tableview와의 UIViewController의 서브 클래스가 있음을 유의하십시오.

확실히 가능하며 테이블 뷰뿐만 아니라 UITableViewController를 사용하지 못하게하는 다른 사용자 정의 UI 요소가 필요할 때 자주 사용됩니다.

일반적으로 뷰 컨트롤러의보기에 초기화 메서드 또는 viewDidLoad 메서드로 추가하도록 선택했습니다. 이는 NIB에서보기를 작성하는지 완전히 프로그래밍 방식으로 작성하는지에 따라 달라집니다. 펜촉의 경우

:

- (id)initWithNibName:(NSString*)nibName bundle:(NSBundle*)bundleName 
{ 
    if ((self = [super initWitNibName:nibName bundle:bundleName])) 
    { 
     self.theTableView = [[UITableView alloc] initWithFrame:CGRectZero style:UITableViewWhateverStyleYouWantHere]; 
     theTableView.dataSource = self, theTableView.delegate = self; 
     [self.view addSubview:theTableView]; 
     [theTableView release]; 
    } 
} 

그리고 당신은 당신의 viewDidLoad 방법에있는 tableview의 프레임을 설정할 수 있습니다.

개인적으로 인터페이스 빌더에서 모든 것을 수행하는 것이 더 나은 코드 유지 방법으로 동일한 결과를 얻는 것을 선호합니다.

+0

IB를 사용하는 것이 "적은 코드"라는 결과를 얻는 방법이 궁금합니다. 이것을 코드에서 완전하게 처리하면,'initWithNibName : bundle :'이 간단한'init'으로 변경 될 것입니다. –

+1

'데이터 소스'는 'dataSource'여야한다고 생각합니다. –

15
/************************************************/ 
/************* MyCustomController.m *************/ 
/************************************************/ 

@interface MyCustomController() <UITableViewDataSource, UITableViewDelegate> 
@property (nonatomic, strong) UITableView *tableView; 
@end 

@implementation MyCustomController 

- (id)initWithNibName:(NSString*)nibName bundle:(NSString*)bundleName 
{ 
    self = [super initWitNibName:nibName bundle:bundleName]; 
    if (self) 
    { 
     self.tableView = [[UITableView alloc] initWithFrame:self.view.bounds style:UITableViewStylePlain]; 
     tableView.datasource = self; 
     tableView.delegate = self; 
     [self.view addSubview:self.tableView]; 
    } 

    return self; 
} 

#pragma mark - UITableViewDataSource Methods 

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 
{ 
    // return number of rows 
} 

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    // return cell 
} 

#pragma mark - UITableViewDelegate Methods 

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    // handle table view selection 
} 

@end 
2

저처럼 이미있는 UITableViewController 생성 한 후, 당신이 통증이있을 것이다 쓰기를 다시 그 거기에 너무 많은 일을했다는 것을 실현하면하여있는 UITableViewController를 추가하려면 다음 다만 수 UIViewController에 하위 뷰로 전달합니다.

UITableViewController* tableViewController = [[UITableViewController alloc] init]; 
[self.view addSubview:tableViewController.tableView]; 

위의 다른 답변은 모두 훌륭합니다. UITableViewController를 많이 투자하여 구현 한 사람들에게는 리팩토링이 고통 스러울 것이라고 생각합니다.

+0

나는 심지어 그런 식으로 선호한다 - 테이블 컨트롤러는 View Controller와 잘 분리되어있다. – Tommz

관련 문제