【问题标题】:Custom UITabBarController and UINavigationController自定义 UITabBarController 和 UINavigationController
【发布时间】:2013-02-20 01:17:11
【问题描述】:

我正在为 iOS5 及更高版本开发应用程序,我不使用情节提要或 IB。我正在创建一个自定义 UITabBarController 并在我的 AppDelegate 中放入 4 个视图控制器,其中只有 1 个 UINavigationController(不知道为什么)。

这导致我只能从 first 选项卡推送新的 VC,这显然是打包到一个名为 navControllerUINavigationController 中:

SGTabBarController *tabBarController = [[SGTabBarController alloc] init];

    SGHomeViewController* vc1 = [[SGHomeViewController alloc] init];
    SGChooseOSAgainViewController* vc3 = [[SGChooseOSAgainViewController alloc] init];
    SGSmsServicesViewController* vc4 = [[SGSmsServicesViewController alloc] init];
    SGSupportViewController *vc5 = [[SGSupportViewController alloc] init];
    navController = [[UINavigationController alloc] initWithRootViewController:vc1];

    NSArray* controllers = [NSArray arrayWithObjects:navController, vc3, vc4, vc5, nil];
    tabBarController.viewControllers = controllers;

    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    self.window.rootViewController = tabBarController;
    [navController setNavigationBarHidden:YES animated:NO];
    [self.window makeKeyAndVisible];

这是为什么呢?我应该为每个选项卡创建一个单独的UINavigationController 吗?我从 Apple 的文档中获取了这段代码。

【问题讨论】:

    标签: iphone ios objective-c cocoa-touch uinavigationcontroller


    【解决方案1】:

    是的,你可以。尝试类似这样的代码 在你的 UITabBarController.m 中:

    - (void)viewDidLoad
    {
        [super viewDidLoad];
            
        NSMutableArray* sectionViewControllers = nil;
        NSArray* controllers = [self controllers];
        UIViewController* controller = nil;
        
        for (controller in controllers)
        {
            if (sectionViewControllers == nil)
                sectionViewControllers = [NSMutableArray arrayWithCapacity:0];
            
            UINavigationController* navigationController = [[UINavigationController allocWithZone:[self zone]] initWithRootViewController:controller];
            
            navigationController.navigationBarHidden = YES;
            
            [sectionViewControllers addObject:navigationController];
            [navigationController release];
        }
        
        self.viewControllers = sectionViewControllers;
    }
    
    - (NSArray*)controllers
    {
        if (!_controllers)
            _controllers = [NSArray arrayWithObjects:[self tabController1], [self tabController2], nil];
        return _controllers;
    }
    

    这在你的 AppDelegate.m 中:

    self.window.rootViewController = self.yourUITabBarController;
    

    【讨论】:

    • 太棒了!我会尝试并报告!
    【解决方案2】:

    我应该为每个标签创建一个单独的 UINavigationController

    如果您想在每个选项卡中导航,是的您应该将每个 viewController 添加到一个 navigationController 中。

    【讨论】:

      【解决方案3】:

      假设你有一个 tabbarController。现在您可以在 tabController 中添加任何 viewController 或任何 NavController。 NavController 可以包含 viewController。但是您可能会对在哪里使用 navController 或 viewController 感到困惑。您将在不需要导航的地方使用 viewController,我的意思是在您不需要的地方。

      这是一个代码示例,其中第一个视图仅包含视图,第二个视图包含导航控制器。您无法在第一个视图中推送新视图,但您可以轻松在第二个视图中推送新视图。

      -(void)addTabBarControllers
      {
          UIViewController *viewController1, *viewController2;
      
          viewController1 = [[[HomeView alloc] initWithNibName:@"HomeView" bundle:nil] autorelease];
          viewController2 = [[[FloorPlanHome alloc] initWithNibName:@"FloorPlanHome" bundle:nil] autorelease];
      
      
          UINavigationController *nav2 = [[UINavigationController alloc] initWithRootViewController:viewController2];
      
          self.tabBarController = [[[UITabBarController alloc] init] autorelease];
          self.tabBarController.viewControllers = [NSArray arrayWithObjects:viewController1, nav2, nil];
      
          [[self.tabBarController.tabBar.items objectAtIndex:0] setTitle:@"First View"];
          [[self.tabBarController.tabBar.items objectAtIndex:1] setTitle:@"Second View"];
      
      
          [[self.tabBarController.tabBar.items objectAtIndex:0] setImage:[UIImage imageNamed:@"first.png"]];
          [[self.tabBarController.tabBar.items objectAtIndex:1] setImage:[UIImage imageNamed:@"second.png"]];
      
          self.window.rootViewController = self.tabBarController;
          [self.window makeKeyAndVisible];
      }
      

      从 AppDelegate 中的 didFinishLaunchingWithOptions 调用此方法。这里 HomeView 和 FloorPlanView 是两个不同的视图,需要先添加这些视图和类文件。

      【讨论】:

        【解决方案4】:

        在这里参考我的回答:
        UITabBarController Issue

        if(!self.tabBarController)
            self.tabBarController = [[UITabBarController alloc] init];
        
        self.tabBarController.delegate=self;
        
        NSMutableArray *localcontrollerarray = [[NSMutableArray alloc] initWithCapacity:2];
        
        UIViewController *viewController1 = [[HomeViewController alloc] initWithNibName:@"HomeViewController" bundle:nil];
        
        UINavigationController *navi1 = [[UINavigationController alloc] initWithRootViewController:viewController1];
        
        [localcontrollerarray addObject:navi1];
        
        UIViewController *viewController2 = [[ScanViewController alloc] initWithNibName:@"ScanViewController" bundle:nil];
        
        UINavigationController *navi2 = [[UINavigationController alloc] initWithRootViewController:viewController2];
        
        [localcontrollerarray addObject:navi2];
        
        self.tabBarController.viewControllers = localcontrollerarray;
        
        [self.window addSubview:self.tabBarController.view];
        

        【讨论】:

          猜你喜欢
          • 2010-11-06
          • 2011-11-28
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多