2010-04-04 5 views
0

여기 있습니다. 현재 TabBar 컨트롤러가 있으며 여러 개의 탐색 컨트롤러가 있습니다. 그냥 같이 : 내 첫 번째 탐색 컨트롤러에서하위보기에서 푸시 뷰 호출

http://tof.canardpc.com/view/d27d1361-c81b-43a0-9b5b-abb13d78e422.jpg

, 나는 NewsViewsController라는 뷰 컨트롤러가 있습니다. 여기에 펜촉이 있습니다 (그림 참조).

내 목표는 분할 된 컨트롤의 위치에 따라 하위 뷰 (내부의 테이블 뷰 포함)를 표시하거나 숨기는 것입니다. 이 방법으로 각 tableview에 대해 두 개의 viewController를 분리 할 수 ​​있습니다. 이것은 실제로 작동 중입니다. 그리고 결과는 다음과 같습니다 (그림 참조).

내 문제는 다음과 같습니다. 셀을 클릭하려고하면 푸시보기가 작동하지 않습니다. 실제로 내 self.navigationController는 null입니다. 상위 탐색 컨트롤러를 사용하여 세부 뷰를 어떻게 푸시 할 수 있습니까?

내 응용 프로그램의 아키텍처가 잘못 되었습니까? 감사합니다 =)

+0

내가 작업하고있는 응용 프로그램에서 비슷한 작업을하고 있지만이 문제가 발생하지 않았습니다. 어쩌면 코드를 게시하면 도움이 될 것입니다. –

답변

0

내비게이션 컨트롤러가 전체보기를 관리하는보기 컨트롤러를 밀고 팝하도록 설정되었습니다. API의 어떤 것도 뷰가 동일한 수퍼 뷰 내에 표시되는 여러보기 컨트롤러를 지원하지 않습니다.

tableview 하위보기 중 하나에서 다음보기를 누르는 대신 "News View"컨트롤러에서 nav을 관리해야합니다. 더 좋은 점은 "News View"컨트롤러 만 있고 각각의 테이블의 델리게이트와 데이터 소스를 구현하는 별도의 클래스가 있어야한다는 것입니다. (보기 컨트롤러에있을 필요는 없습니다.)

다음과 같은 것이 있습니다.

nextViewController=// intialize or get reference to next view controller 
[self.nav pushViewController:nextViewController animated:YES]; 
: NewsViewController.m

CustomClasses 하나의 didSelectRow 방법에이어서
- (void) viewWillAppear{ 
    self.newsTableDelegateAndDataSource.nav= // reference to the navigation controller; 
    self.categoryTableDelegateAndDataSource.nav = // reference to the navigation controller; 
} 

@interface NewsViewController { 
    CustomClass1 *newsTableDelegateAndDataSource; 
    CustomClass2 *categoryTableDelegateAndDataSource; 
} 

@interface CustomClass1 { 
    UINavigationController *nav; 
} 

nav가 NewsViewController 위에 nextViewController를 밀고 새 화면을 표시합니다. 그것이 완료되면, 스스로 열리고 NewsViewController가 왼쪽에 나타납니다.

이렇게하면 언제든지 하나의보기 컨트롤러 만 활성화되어 API가 원활하게 작동하지만 각 테이블의 동작을 캡슐화 할 수 있습니다. 자신의 수업.

모두가 만족합니다.

+0

안녕하세요 TechZen과 시간 내 주셔서 감사합니다. 방금 ​​추가했습니다. self.newsTableDelegateAndDataSource.nav = navigationController; 님께 내 NewsViewController.m의 viewWillAppearear가 지금 작동 중입니다. 정말 고맙습니다. 그러나 "당신은"뉴스보기 "컨트롤러가 있어야하고 각 테이블의 대리인과 데이터 소스를 구현하는 별도의 클래스가 있어야한다는 것을 알고 싶습니다." 실제로 NewsViewsController 펜촉을 통해 내 tableviews에 연결된 두 개의 분리 된 클래스 (NewsTableViewController & CategoryTableViewController)가 이미 있습니다. 그게 뭐가 잘못 됐어? –

0

하위 뷰에서 부모 메서드를 호출하여이를 달성했습니다. 부모 메서드는 밀어 넣기를 수행합니다.

서브 뷰 :

@protocol SubUIViewDelegate 
    -(void)pushViewController:(UIViewController*)ctrl; 
@end 

@interface ... { 
    ... 
    id<SubUIViewDelegate> delegate; 
} 
@property (nonatomic,assign) id <SubUIViewDelegate> delegate; 
... 
@end 

그런 다음 대리자를 @synthesize와 서브 뷰에서

[self.delegate pushViewController : new_view_ctrl]; 

부모보기 컨트롤러 푸시를 호출하는 다음 사용

@interface parentview : ... <SubUIViewDelegate> { 
    ... 
} 
-(void) pushViewController: (UIViewController*) ctrl; 

구현하는 :

subview.delegate = self; 

-(void)pushViewController:(UIViewController*)ctrl { 
    [self.navigationController pushViewController:ctrl animated:YES]; 
} 

희망이 도움이됩니다.

관련 문제