-->

解雇的UITabBarController UINavigationController的模式(UI

2019-10-16 23:19发布

我这里有一个非常有趣的问题。 我的iPhone应用程序有一个的UITabBarController为RootViewController的在AppDelegate中。

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

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

当配置完成后,我想摆脱firstRunViewController的。 我使用这种技术,很多时候,使用-dismissModalViewControllerAnimated:

但在这个星座,这并不工作。 它不会从什么控制器我打电话解雇无关紧要。 我通过tabbarController,该RootViewController的,当前有效的viewController试了一下,造成自己和其他几个控制器。

每次我打电话-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我从上面发现了错误。

Answer 1:

在我看来,你在滥用的UITabBarController。 这个类,即使的UIViewController的一个子类,并没有真正使用多少的UIViewController基础设施。

你想要什么是你现在有什么略有延长。 创建您的appDelegate一个新的UIViewController子类,并将其添加为单一对象的数组,并设置的TabBar的viewControllers这个阵列。 设置你的子类hidesBottomBarWhenPushed为YES所以它隐藏标签栏时,它变得可见。

现在,您的应用程序将启动,你的UIViewController子类将成为最前面的视图。 你可以使这个观点你想模态呈现,或者你可以从你的子类使用某种动画的呈现视图。 哦,如果你使用启动视图作为背景图片为您的子类,你才能真正使这个平稳过渡 - 我现在做到这一点。

当你的模式的看法做了,那么你可以实例要然后显示任何意见,并设置的UITabBarController使用具有tabBarController.viewControllers(或动画版)的意见。 噗,你的UIViewController将获得将取代(和ARC下只是消失)。



Answer 2:

我没有机会测试我的假设,但我怀疑,这个问题可以依靠的事实,你正在呈现模式的看法还为时过早,因此太早意味着在主窗口已建立标签的机会之前栏控制器。 所以,我建议这样的变化:

  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]; 

这里调用该方法,因为我在做2的诀窍是调用initializeAndPresentNavigationController将被简单地推在主回路,并执行您的应用程序已建立其初始UI的可能性之后。

希望对你有效。



Answer 3:

我终于找到了自己的答案! 我只是看不到树木,不见森林! 我很高兴,现在! :)

我真的做了傻事:在设置viewControllers最后的viewController我不得不改变相对应的用户是否是管理员或不tabars viewControllers。 所以我做了:

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

你可以看到,我加入AppDelegate中的“navCtrl”的TabBar的viewControllers。 所以我想解雇我刚添加到parentViewControllers(的UITabBarController)子控制器一个的viewController。

驳回东西,我想在同一时刻只存在是不可取的! :))



文章来源: UITabbarController dismiss modal UINavigationController