iPhone标签栏更多导航控制器没有正确处理导航控制器?

时间:2011-04-28 07:25:59

标签: iphone uinavigationcontroller uitabbarcontroller

显示在超过5个项目的标签栏中的moreViewController似乎正确处理视图控制器但不处理导航控制器。任何人都可以解释为什么会这样吗?

以下是如何在散文中重现问题,然后在代码中重现:

我在6个标签中创建了一个带有6个UIViewControllers的简单应用。由于我有超过5个选项卡,因此选项卡“5”和“6”位于moreNavigationList中。 第6个选项卡包含一个按钮,按下该按钮可删除第一个选项卡。这会将选项卡的数量减少到5,因此不再需要moreNavigationController并消失。标签“6”现在移动到标签栏的最后一个位置。一切都如预期的那样。

现在,如果将视图控制器从选项卡“6”(即带按钮的那个)放入导航控制器,事情就会中断。如果我按下按钮,从标签栏中删除标签“1”,则moreNavigationController消失,标签栏的最后一个标签现在显示标签“6”。然而,它的内容已经消失。没有按钮,没有任何东西。

从分析视图层次结构来看,似乎正在发生的事情是moreNavigationController从[tabBarController viewControllers]中的原始导航控制器中删除了“6”视图控制器,并将其添加到自己的堆栈中。但是当moreNavigationController消失时,似乎没有把它放回去。

以下是我在基于简单窗口的测试应用程序中重现此代码的代码:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{
    // Create a tab bar with 5 regular view controllers and a navigation controller
    self.tabBarController = [[[UITabBarController alloc] init] autorelease];

    UIViewController* vc1 = [[[UIViewController alloc] init] autorelease]; vc1.title = @"1";
    UIViewController* vc2 = [[[UIViewController alloc] init] autorelease]; vc2.title = @"2";
    UIViewController* vc3 = [[[UIViewController alloc] init] autorelease]; vc3.title = @"3";
    UIViewController* vc4 = [[[UIViewController alloc] init] autorelease]; vc4.title = @"4";
    UIViewController* vc5 = [[[UIViewController alloc] init] autorelease]; vc5.title = @"5";
    UIViewController* vc6 = [[[UIViewController alloc] init] autorelease]; vc6.title = @"6";

    // Add a button that removes tab "1" when pressed to vc6
    UIButton *moveButton = [self moveButton];
    [vc6.view addSubview:moveButton];
    vc6.view.backgroundColor = [UIColor greenColor];
    moveButton.center = vc6.view.center;

    UINavigationController* navController = [[[UINavigationController alloc] initWithRootViewController:vc6] autorelease];

    // Everything is fine if vc6 is added directly instead of inside a navigation controller
    NSArray* controllers = [NSArray arrayWithObjects:vc1, vc2, vc3, vc4, vc5, navController, nil];
    tabBarController.viewControllers = controllers;

    [self.window addSubview:tabBarController.view];
    [self.window makeKeyAndVisible];
    return YES;
}


- (UIButton *)moveButton 
{
    UIButton *moveButton = [UIButton buttonWithType:UIButtonTypeRoundedRect];
    moveButton.frame = CGRectMake(0, 0, 150, 50);
    [moveButton setTitle:@"Remove 1" forState:UIControlStateNormal];
    [moveButton addTarget:self action:@selector(remove) forControlEvents:UIControlEventTouchUpInside];
    return moveButton;
}


- (void)remove 
{
    // remove 1st tab bar item (this also removes moreNavigationController)
    NSMutableArray *viewControllers = [NSMutableArray arrayWithArray:tabBarController.viewControllers];
    [viewControllers removeObjectAtIndex:0];
    [tabBarController setViewControllers:viewControllers];
}

使用的SDK是4.3

1 个答案:

答案 0 :(得分:0)

我遇到了同样的问题,花了好几个小时研究解决方案。事实证明,事实并非如此。

问题是嵌套的导航控制器。您的导航控制器被放置在moreNavigationController中,并且当它被取出时会发生错误。正如delirus提示的那样,您可以使用[moreNavigationController popToRootViewControllerAnimated:]获取导航控制器的子视图,并将它们放在新的导航控制器中并显示它。我尝试了这个,并找到了为什么这个问题从未得到解决:你的导航栏将“重叠”。

如果您在导航控制器中深入了解一些视图,然后将其置于moreNavigationController中,则更多导航控制器的“后退”按钮将替换导航控制器的“后退”按钮。还有一些其他情况会导致导航条发生冲突。

您可以使用自己的后退按钮创建第二个工具栏,或覆盖“更多”按钮的工作方式,但我发现保持用户直观性只有两种解决方法 - 不要在Tab Bar控制器中嵌入导航控制器,或限制标签数量。

我意识到这个问题已经过时了,但我希望这个答案可以帮助别人省点麻烦。如果有人有任何问题(或其他解决方法的建议!),请告诉我。