我在这里遇到了一个非常有趣的问题。我的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上我从上面得到错误。
答案 0 :(得分:1)
在我看来,你在滥用UITabbarController。这个类,即使是UIViewController的子类,也没有真正使用UIViewController基础结构。
你想要的是你现在拥有的东西的轻微扩展。在appDelegate中创建一个新的UIViewController子类,并将其作为单个对象添加到数组中,并将tabBar的viewControllers设置为此数组。设置你的子类&#39; hidesBottomBar当推送到YES时,它会在标签栏变为可见时隐藏它。
现在你的应用程序将启动,你的UIViewController子类将成为最前面的视图。您可以将此视图设置为您想要以模态方式呈现的视图,也可以使用某种动画从子类中显示该视图。哦,如果你使用启动视图作为你的子类的背景图像,你可以真正使它平滑过渡 - 我现在就这样做。
当你的模态视图完成后,你可以实例化你想要显示的任何视图,并设置UITabBarController以使用tabBarController.viewControllers(或动画版本)这些视图。噗,你UIViewController将被替换(并且在ARC下消失)。
答案 1 :(得分:1)
我没有机会测试我的假设,但我怀疑这个问题可能取决于你过早提出模态视图这一事实,即在主窗口有机会设置之前过早意味着标签栏控制器。所以,我建议这样做:
创建一个实例化导航控制器的方法:
- (void)initializeAndPresentNavigationController {
UINavigationController *navCtrl = [[UINavigationController alloc] initWithRootViewController:firstRun];
[[self tabBarController] presentModalViewController:navCtrl animated:NO];
}
不是直接从appDidFinishLaunching呈现导航控制器,而是异步调用上面的方法:
[self performSelector:@selector(initializeAndPresentNavigationController) withObject:nil afterDelay:0.0];
这里调用方法的技巧就像我在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。
在同一时刻解雇我想要呈现的东西是不可取的! :))