iPhone选项卡栏moreNavigationController未正确处理导航控制器?

iPhone选项卡栏moreNavigationController未正确处理导航控制器?,iphone,uinavigationcontroller,uitabbarcontroller,Iphone,Uinavigationcontroller,Uitabbarcontroller,显示在包含5个以上项目的选项卡栏中的moreViewController似乎正确处理视图控制器,但不正确处理导航控制器。有人能解释为什么会这样吗 下面是如何用散文和代码再现问题: 我创建了一个简单的应用程序,在6个选项卡中包含6个UIViewController。因为我有5个以上的选项卡,所以选项卡“5”和“6”位于moreNavigationList中。 第六个选项卡包含一个按钮,按下该按钮时,将删除第一个选项卡。这将选项卡的数量减少到5个,因此不再需要moreNavigationContro

显示在包含5个以上项目的选项卡栏中的moreViewController似乎正确处理视图控制器,但不正确处理导航控制器。有人能解释为什么会这样吗

下面是如何用散文和代码再现问题:

我创建了一个简单的应用程序,在6个选项卡中包含6个UIViewController。因为我有5个以上的选项卡,所以选项卡“5”和“6”位于moreNavigationList中。 第六个选项卡包含一个按钮,按下该按钮时,将删除第一个选项卡。这将选项卡的数量减少到5个,因此不再需要moreNavigationController并将其消失。选项卡“6”现在移动到选项卡栏的最后一个位置。一切如期而至

现在,如果将选项卡“6”中的视图控制器(即带有按钮的视图控制器)放入导航控制器,则会出现故障。如果我按下按钮,选项卡“1”将从选项卡栏中移除,moreNavigationController将消失,选项卡“6”现在显示在选项卡栏的最后一个位置。然而,它的内容已经消失了。没有按钮,什么都没有

通过分析视图层次结构,似乎正在发生的是moreNavigationController从[tabBarController ViewController]中的原始导航控制器中删除“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

我遇到了同样的问题,花了数小时寻找解决方案。事实证明,实际上并没有

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

如果在导航控制器中深入查看一些视图,然后将其放置在moreNavigationController中,moreNavigationController的后退按钮将替换导航控制器的后退按钮。在其他一些情况下,导航栏会发生冲突

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


我意识到这个问题已经很老了,但我希望这个答案能为别人省去一些麻烦。如果有人有任何问题(或其他解决方法的建议!),请告诉我。

我遇到了同样的问题,花了数小时寻找解决方案。事实证明,实际上并没有

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

如果在导航控制器中深入查看一些视图,然后将其放置在moreNavigationController中,moreNavigationController的后退按钮将替换导航控制器的后退按钮。在其他一些情况下,导航栏会发生冲突

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


我意识到这个问题已经很老了,但我希望这个答案能为别人省去一些麻烦。如果有人有任何问题(或对其他解决方法的建议!),请告诉我。

您找到解决该问题的方法了吗?我一直在强迫moreNavigationController弹出推送的控制器,这样控制器就回到了原来的导航堆栈中。。。我发现UIKit的private
UIMoreNavigationController
类有一个private
-\u restoreOriginalNavigationController
方法,但它只是说moreNavigationController会弄乱导航堆栈。你找到解决这个问题的方法了吗?我一直在强迫moreNavigationController弹出推送的控制器,这样控制器就回到了原来的导航堆栈中。。。我发现UIKit的private
UIMoreNavigationController
类有一个private
-\u restoreOriginalNavigationController
方法,但它只是说moreNavigationController会弄乱导航堆栈。