2012-07-08 3 views
0

Apple 문서뿐만 아니라 유사한 스택 오버플로 문제를 잘 살펴 봤지만 탭바를 사용할 때 navigationController가 null 인 이유에 대해 계속 설명합니다. 코드에서 응용 프로그램의 대부분을 구축하려고하는데 XIB를 사용하여 navigationController를 삽입하지 않습니다.UINavigationController가 NULL입니다.

디버깅하는 동안 두 개의 탭으로 내 앱을 크게 단순화했습니다. 하나의 탭은 테이블 뷰를 유지하고 행이 터치되면 XIB의 세부 정보 페이지가 나타날 것으로 예상됩니다. 꽤 간단해야합니다. self.navigationController의 값이 자세히보기를 푸시 할 때 NULL임을 알았습니다. 그리고 물론 작동하지 않습니다. 우리는 완전히 탭 막대를 가져 왔고 단일보기 (테이블보기)에서 제대로 작동합니다. 이 인스턴스에서는 self.navigationController에 값이 있습니다. TextTableViewController.m

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    TextViewController *detailViewController = [[TextViewController alloc] initWithNibName:@"TextViewController" bundle:nil]; 
    Text *text = [[Text alloc] init]; 
    text = [textArray objectAtIndex:indexPath.row]; 

    detailViewController.TextID = text.textID; 
    NSLog(@"Nav Controller: %@",self.navigationController); 
    [self.navigationController pushViewController:detailViewController animated:YES]; 
    NSLog(@"pushed"); 
} 

에서

AppDelegate.m

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{ 
    // With Tab Bars 

    self.tabBarController = [[UITabBarController alloc] init]; 

    ViewController *vc1 = [[ViewController alloc] initWithNibName:@"ViewController" bundle:nil]; 
    vc1.tabBarItem.title = @"Words"; 
    vc1.tabBarItem.image = [UIImage imageNamed:@"tab_feed.png"]; 

    TextTableViewController *vc2 = [[TextTableViewController alloc] init]; 
    vc2.tabBarItem.title = @"Text"; 
    vc2.tabBarItem.image = [UIImage imageNamed:@"tab_live.png"]; 

    UINavigationController* navController = [[UINavigationController alloc] initWithRootViewController:vc1];        
    NSArray* controllers = [NSArray arrayWithObjects:vc2, navController, nil]; 
    tabBarController.viewControllers = controllers; 
    tabBarController.delegate = self; 

    window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; 
    window.rootViewController = self.tabBarController; 
    [window makeKeyAndVisible]; 
    return YES; 
} 

나는이 문제에 관한 두 가지 질문 있어요. (1)이 줄의 목적은 무엇입니까? 그것이 출입하는 경우에는 차이를 보이지 않지만 Apple 사례에서는 빠져 있습니다.

tabBarController.delegate = self; 

(2) 탭 배열을 만들 때보기 중 하나가 navigationController가됩니다. 어떤 탭인지 또는 다른 탭과 관련이 없으며 표시되지 않는지 여부가 중요합니다. 문제가있는 곳입니까?

답변

1

탭 표시 줄 컨트롤러의 대리자에 대한 질문 (1)에 대한 대답은 UITabBarControllerDelegate 프로토콜 참조를 참조하십시오. 탭 표시 줄 컨트롤러의 기본 기능의 경우 대리인을 괴롭히지 않아도됩니다.

하지만 사용자가 탭을 변경할 때 문서를 저장하거나 인터페이스 요소를 기본값으로 재설정하는 등 특별한 작업을 수행한다고 가정 해 보겠습니다. 당신은, 당신의 클래스 중 하나, 아마도 앱 위임 또는 다른 컨트롤러 클래스를 만드는 UITabBarControllerDelegate 프로토콜을 준수하고 tabBarController을 구현할 수 : didSelectViewController : 각 탭 자체 UINavigation 컨트롤러가 필요합니다 경우 "답"에서

당신이 물었다. 그것은 절대적으로 맞습니다. 기본적으로 각 탭은 완전히 독립적 인 계층 구조이므로 필요로하는 각 탭에 별도의 UINavigation 컨트롤러가 필요합니다.

이것은 원래 게시물의 질문 (2)에 대한 답변을 의미해야합니다. 필요한 특정 탭에 탐색 컨트롤러를 추가해야합니다.

0

확인 했어요. UINavigationController는 UITabBarController의 해당 탭 내에 포함되어야합니다. 따라서이 코딩 변경 (아래)을 작성하면 새로운 UINavigationController가 tabview에 탭에 포함됩니다. 다음 질문을 구걸

UINavigationController* navController = [[UINavigationController alloc] initWithRootViewController:vc2];        
NSArray* controllers = [NSArray arrayWithObjects:vc1, navController, nil]; 

:이 여러 예제가 필요한 경우 무엇을 - 당신은 하나의 필요성이있는 각 탭에 대한 새로운 UINavigationController가를 생성하고, rootViewController로 각각 표시합니까?

+0

'UINavigationController' 배열을 만들고'setViewControllers :'메서드를 사용하여'UITabBarController'에 추가하십시오. – sooper

+0

감사합니다. scooper 이것을 확인해 보겠습니다. – ardochhigh

관련 문제