1

我在这里得到了一个非常有趣的问题。我的iPhone应用程序在AppDelegate中有一个UITabbarController作为rootViewController。UITabbarController关闭模式UINavigationController

如果应用程序第一次打开,它必须基本配置。为了这个目的,我创建的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我得到错误FR om以上。

回答

1

我终于自己找到了答案! 我只是看不到树木!我现在很开心! :)

我做了真正愚蠢的事情:在设置viewControllers的最后一个viewController我不得不改变tabars viewControllers对应于用户是否是管理员。所以我做了:

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

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

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

1

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

你想要什么是你现在拥有的东西的略微延伸。在appDelegate中创建一个新的UIViewController子类,并将其作为单个对象添加到数组中,并将tabBar的viewControllers设置为该数组。设置你的子类的hidesBottomBarWhenPressed为YES,这样它就隐藏了标签栏,当它变得可见时。

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

当你的模式的看法做了,那么你可以实例要然后显示任何意见,并设置的UITabBarController使用具有tabBarController.viewControllers(或动画版)的意见。噗,你的UIViewController将会被替换(并且在ARC下消失)。

+0

这类作品...但我不能应用动画。我试图在最后一个模式viewController上添加[UIView animateWithDuratio:]。但动画只是不显示。 –

+0

我真的很想了解问题所在。因为我提出了一个modalViewController(日常业务),就像我一样,当我提出我的login-viewController时。我认为问题是更多的一个实例,导航控制器... –

1

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

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

    1. 创建方法实例导航控制器

      [self performSelector:@selector(initializeAndPresentNavigationController) withObject:nil afterDelay:0.0]; 
      

    这里调用方法的技巧我在2中做的是,initializeAndPresentNavigationController的调用将被简单地推到主循环上,并在应用程序有可能构建其初始UI之后执行。

    希望它适合你。

  • +0

    嘿塞尔吉奥!谢谢你的帮助。但是这个解决方案不起作用。它导致相同的错误**呈现控制器的ViewViewController本身就是解雇:** –

    相关问题