【问题标题】:Going from NavigationController to TabBarController从 NavigationController 到 TabBarController
【发布时间】:2014-04-09 23:24:33
【问题描述】:

所以...我有一个被推送到 NavigationController 上的 ViewController。在界面构建器中,我创建了一个单独的 ViewController 并将其嵌入到 TabBarController 中,它在界面构建器中看起来不错。

在我的应用程序中,我试图从 NavigationView 中的一个 ViewController 转到 TabBarController 中的 ViewController。我将如何以正确的方式做到这一点?我不能只将视图推送到 NavigationController 上,因为底部的标签栏不会显示出来。

任何帮助将不胜感激。

【问题讨论】:

    标签: ios objective-c cocoa-touch


    【解决方案1】:

    我相信您使用 UINavigationController 和 UITabBarController 是按照推荐的最佳实践倒序操作的。

    除非在过去一两年发生了一些变化(可能已经发生了),否则 UINavigationController 不应该有一个 UITabBarController 被推到它上面。如果您在应用程序中使用 UITabBarController,它应该是 window.rootViewController,并且导航控制器是 UITabBarController 的 viewControllers 数组的成员。

    我正试图从我的 NavigationView 中的一个 ViewControllers 中去 到 TabBarController 中的 ViewController。我该怎么做 正确的方法?

    在该结构中,您可以将目标视图控制器分配为 viewControllers 数组的另一个元素。然后,按照我的风格,我会从你的第一个视图控制器发送一个类似于“LaunchOtherViewController”的 NSNotification,因此你不需要第一个视图控制器知道标签栏控制器或第二个视图控制器。然后让一些知道第二个视图控制器的类接收该通知,并将 UITabBarController 的 selectedIndex 更新为第二个目标视图控制器的。

    希望这是有道理的。

    【讨论】:

    • 那么,这样做是个好习惯吗?: UIWindow *window = [[[UIApplication sharedApplication] windows] objectAtIndex:0]; window.rootViewController = myTabBarController;
    • @DavidB 就是这样。该代码正在获取窗口,就好像没有可用的窗口 ivar 一样,例如在 UIApplicationDelegate 子类中,通常在带有 IBOutlet 的 xib 文件中定义。所以我想知道,你是从应用程序的其他地方分配 window.rootViewController = myTabBarController 吗,它是在启动时不是吗?
    • 好吧,这就是我正在做的事情: UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil]; DriverHomeViewController *createdViewController = [storyboard instantiateViewControllerWithIdentifier:@"driverHome"]; UITabBarController *bar = [[UITabBarController alloc] init]; UIWindow *window = [[[UIApplication sharedApplication] windows] objectAtIndex:0]; window.rootViewController = 栏; [bar presentViewController:createdViewController 动画:YES 完成:nil];
    • 如何从 AppDelagte 访问窗口 ivar?
    • 另外,我现在在转换后收到此错误:对 的开始/结束外观转换的不平衡调用。
    【解决方案2】:

    您需要将 TabBarController 推送到视图上。您可能需要设置选项卡栏的选定视图控制器,但重要的是选项卡栏控制器实际推送到导航堆栈(或以模态方式呈现)。

    【讨论】:

    • 是我一个人,还是和苹果HIG背道而驰?或者其他一些推荐的 UITabBarController 和 UINavigationController 之间的交互。我已经很多年没有使用股票视图控制器了,但是有人建议不要将 UITabBarController 放在 UINavigationController 中,但建议相反。
    • 简而言之,是的。 TabBarController 应该始终是根视图控制器,这意味着它应该是窗口的根视图,或者应该以模态方式呈现。但是 Xcode 和 Cocoa 都不会阻止你这样做。我不确定这样做的应用程序是否会通过应用程序商店的审核,但他不一定是在编写应用程序商店应用程序。无论哪种方式,这个评论可能更适合这个问题,而不是我的回答。
    • 感谢您的称赞。我还发布了相同的想法,并提供了更多详细信息作为答案:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多