2011-12-11 3 views
2

동일한 NIB에서 두 개의 UITableView가 필요합니다. 저는 IB를 사용하고 두 테이블을 가진 뷰를 생성했습니다.iPhone : 하나의 NIB에서 두 테이블을 제어하는 ​​방법

내 헤더 파일에는 ViewController와 각 테이블에 대해 하나씩 두 개의 클래스가 있습니다 (아래 참조). IB에서는 각 테이블의 대리자와 데이터 소스를 FileOwner에 연결할 수 있지만 IBOutlet 연결을 만드는 방법을 배울 수는 없습니다. 이 메시지가 나타납니다 : - [News tableView : numberOfRowsInSection :] : 인스턴스로 전송 된 인식 할 수없는 선택자 0x15d3c0 2011-12-11 07 : 20 : 27.480 myCity1 [659 : 707] 'NSInvalidArgumentException' 이유 : '- [뉴스있는 tableView : numberOfRowsInSection :] : 인식 할 수없는 선택기 인스턴스 0x15d3c0로 전송'

여기 헤더 파일입니다 :

@interface News : UIViewController { 

} 

@end 

@interface TownNews : UITableViewController { 

UITableView *townNewsTable; 

} 

@property (nonatomic, retain) IBOutlet UITableView *townNewsTable; 

@end 

@interface GeneralNews : UITableViewController { 

UITableView *generalNewsTable; 

} 

@property (nonatomic, retain) IBOutlet UITableView *generalNewsTable; 

@end 

답변

6

내 프로젝트 중 하나에이 일을 처리했다 (당신은 그것을 볼 수있다 : 앱 스토어에 IJCAI11이라는 이름의 무료 앱, 'People'탭 (색인 생성은 별도의 tableView)); 그리고 위의 코드에서 볼 수있는 것처럼, 너무 복잡하게 만들 수 있습니다. 내가하지 말아야 할 것을 말하는 대신에 어떻게했는지 설명 할 것입니다.

저는 YaddaYaddaViewController라고 가정 해 봅시다. 의 ViewController가있는 UIViewController하지있는 UITableViewController에서 파생되는

@interface YaddaYaddaViewController : UIViewController <UITableViewDelegate, UITableViewDataSource> 
{ 
    UITableView *tableView1; 
    UITableView *tableView2; 
} 
@property (nonatomic, retain) IBOutlet UITableView * tableView1; 
@property (nonatomic, retain) IBOutlet UITableView * tableView2; 

@end 

주 (클래스있는 UITableViewController의 목표는 항상있는 UIViewController를 사용해야 이상의 사용자 정의 물건 2 분 안에 간단한있는 tableView을 구현할 수있을 것입니다.에 대한 자세한 내용을 읽으려면 UITableViewController 클래스의 문서를 한 눈에 볼 수 있습니다.)

"File 's Owner"의 IB에서는 간단히 YaddaYaddaViewController를 설정합니다. tableView1 및 tableView2 아웃렛을 뷰의 적절한 테이블에 연결합니다. 위임자와 데이터 소스를 tableView1/2에 모두 연결하기 때문에 '여러 개의'위임자와 데이터 소스가 있습니다.

그리고 마지막으로, 코드에서 모든 대리자 메서드 (예를 tableView에 대한 :

: cellForRowAtIndexPath : 난 그냥있는 tableView 값에주의, 대리자 이벤트가있는 것처럼,이 메소드의 호출을 발생
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    if (tableView == self.tableView1) { 
     // some code here 
    } else { 
     // alternative code here 
    } 
} 

희망이 도움이됩니다. 그가 말한 어떤

+0

감사 Makaron을 확인 DidSelectRowAtIndexPath

NumberOfRowsInSection, NumberOfSection, CellForRowAtIndexPath처럼 모든있는 tableview 대표에 태그의 도움으로 비교 . 그것은 훨씬 쉬워 보인다. 감사합니다 – Jeremy

-1

@makaron 절대적으로 올바르게 jQuery과의 선언하고 라이브러리 (하지 프로그램과의 tableview를 만들려면) 다음에 헤더 파일을 변경

1)을 제외입니다 : -

@interface MyTableViewController : UIViewController <UITableViewDelegate, UITableViewDataSource> 
{ 
    IBOutlet UITableView *tableView1; 
    IBOutlet UITableView *tableView2; 
} 

@end 
조건을 확인 DidSelectRowAtIndexPath

NumberOfRowsInSection, NumberOfSection, CellForRowAtIndexPath 같은

및 모든 tableview에 위임

if (tableView == self.tableView1) { 
     // code for tableView1 
    } else { 
     // code for tableView2 
    } 

또한 헤더 파일에 두 개의 tableViews를 선언하지 않으려는 경우.두 가지의 tableview의 라이브러리는보기 드롭 다운 그들 각각에 태그를 설정하고 조건

//I am assuming that tableView1 has tag set to be 1 

    if (tableView.tag==1) { 
      // code for tableView1 
     } else { 
      // code for tableView2 
     } 
+0

솔직히 말해서, 대답의 첫 부분이 내 것과 어떻게 다른지 나는 알 수 없습니다. 두 번째 정보 ... 네, 접근 방식입니다. 가능한 경우 태그 대신 객체의 범위 (원하는 경우 OOP 방식)에 머물 것을 선호합니다. 그냥 내가 그 일을 overcomplicating 그를 의심하는 것을 제외하고 제레미의 코드로 잘못되었다고하지 않았다는 것을 유의하십시오. – makaron

+0

우선 인터페이스 작성기를 통해 만들 때 (즉, 프로그래밍 방식으로 tableView를 작성하지 않는 경우) 헤더 파일에 IBOutlet을 제공합니다. IBOutlet은 Interface Builder Outlet을 의미합니다. 두 번째 것은 UITableView의 속성을 원자가가 아니고 유지하도록 설정하지 않은보기 하나만 처리해야 할 때입니다. –

+0

emmm ... 처음 HelloWorld 사과 설명서에서 얻은 정보에 대해 고마움을 전합니다.)) 맨, IBOutlet을 설정했고 apple doc에 따라 설정되었습니다. 야, 나는 비 원자를 설정하고 유지 : 같은 문자열에, 또한 사과 의사에 따르면. – makaron

관련 문제