0

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

它导致我只能从第一个选项卡推送新 VC 的行为这显然是打包到UINavigationController被调用的navController

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 的文档中获取了这段代码。

4

4 回答 4

2

我应该为每个选项卡创建一个单独的 UINavigationController

如果您想在每个选项卡中导航,的,您应该添加嵌入在 navigationController 中的每个 viewController。

于 2013-03-05T15:26:27.373 回答
2

是的你可以。在 yourUITabBarController.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;
于 2013-03-05T15:31:07.113 回答
1

假设你有一个 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 是两个不同的视图,需要先添加这些视图和类文件。

于 2013-03-05T15:33:54.817 回答
0

在这里参考我的回答:
UITabBarController 问题

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];
于 2013-03-05T15:33:49.427 回答