UITabbarController忽略模态UINavigationController

时间:2012-07-04 11:59:07

标签: uiviewcontroller uinavigationcontroller uitabbarcontroller modalviewcontroller dismiss

我在这里遇到了一个非常有趣的问题。我的iPhone应用程序在AppDelegate中有一个UITabbarController作为rootViewController。

如果第一次打开应用程序,则必须基本配置。为此,我创建了一个UINavigationController并告诉tabbarController以模态方式呈现它:

firstRun = [[firstRunViewController alloc] init];
navCtrl = [[UINavigationController alloc] initWithRootViewController:firstRun];
[[self tabBarController] presentModalViewController:navCtrl animated:NO];

配置完成后,我想摆脱firstRunViewController。我经常使用这种技术,使用-dismissModalViewControllerAnimated:

但在这个星座中这不起作用。从我称之为解雇的控制器无关紧要。 我通过tabbarController,rootViewController,当前活动的viewController,原因self和其他几个控制器试了一下。

每次我致电-dismissModalViewControllerAnimated:我都会遇到此异常:

'UIViewControllerHierarchyInconsistency', reason: 'presentedViewController for controller is itself on dismiss for: <UINavigationController:…

有人可以帮忙吗?提前致谢,亲切的问候,朱利安

修改 在我的AppDelegate中,我使用UITabbarController作为主窗口的rootViewController:

self.window.rootViewController = self.tabBarController;
[self.window makeKeyAndVisible];

然后我正在创建一个UINavigationController并告诉UITabbarController呈现modalViewController:

UINavigationController *navCtrl = [[UINavigationController alloc] initWithRootViewController:firstRun];
[[self tabBarController] presentModalViewController:navCtrl animated:NO];

当我现在调用-dismissModalViewControllerAnimated:在firstViewController上我从上面得到错误。

3 个答案:

答案 0 :(得分:1)

在我看来,你在滥用UITabbarController。这个类,即使是UIViewController的子类,也没有真正使用UIViewController基础结构。

你想要的是你现在拥有的东西的轻微扩展。在appDelegate中创建一个新的UIViewController子类,并将其作为单个对象添加到数组中,并将tabBar的viewControllers设置为此数组。设置你的子类&#39; hidesBottomBar当推送到YES时,它会在标签栏变为可见时隐藏它。

现在你的应用程序将启动,你的UIViewController子类将成为最前面的视图。您可以将此视图设置为您想要以模态方式呈现的视图,也可以使用某种动画从子类中显示该视图。哦,如果你使用启动视图作为你的子类的背景图像,你可以真正使它平滑过渡 - 我现在就这样做。

当你的模态视图完成后,你可以实例化你想要显示的任何视图,并设置UITabBarController以使用tabBarController.viewControllers(或动画版本)这些视图。噗,你UIViewController将被替换(并且在ARC下消失)。

答案 1 :(得分:1)

我没有机会测试我的假设,但我怀疑这个问题可能取决于你过早提出模态视图这一事实,即在主窗口有机会设置之前过早意味着标签栏控制器。所以,我建议这样做:

  1. 创建一个实例化导航控制器的方法:

    - (void)initializeAndPresentNavigationController {
      UINavigationController *navCtrl = [[UINavigationController alloc] initWithRootViewController:firstRun];
      [[self tabBarController] presentModalViewController:navCtrl animated:NO];
    }
    
  2. 不是直接从appDidFinishLaunching呈现导航控制器,而是异步调用上面的方法:

    [self performSelector:@selector(initializeAndPresentNavigationController) withObject:nil afterDelay:0.0];
    
  3. 这里调用方法的技巧就像我在2中那样调用initializeAndPresentNavigationController只是简单地推送到主循环上,并在你的应用程序有可能构建其初始UI之后执行。< / p>

    希望它适合你。

答案 2 :(得分:1)

我终于找到了自己的答案! 我根本看不到树木!我现在很高兴! :)

我做了很傻的事情:在设置viewControllers的最后一个viewController中,我不得不更改对应于用户是否是管理员的tabars viewControllers。所以我做了:

appDelegate.tabBarController.viewControllers = [NSArray arrayWithObjects:appDelegate.readState,
                                                appDelegate.navCtrl,
                                                appDelegate.settings, nil];

您可以看到我正在将AppDelegate的“navCtrl”添加到tabbar的viewControllers中。所以我试图解除我刚刚添加到parentViewControllers(UITabbarController)子控制器的viewController。

在同一时刻解雇我想要呈现的东西是不可取的! :))