如何在不使用 UINavigationController 的情况下过渡到新的非模型视图控制器?

Posted

技术标签:

【中文标题】如何在不使用 UINavigationController 的情况下过渡到新的非模型视图控制器?【英文标题】:How do you transition in a new non-model view controller without using UINavigationController? 【发布时间】:2013-02-06 21:48:00 【问题描述】:

以下似乎是一个典型的用例:您使用显示登录屏幕的 LoginViewController 启动应用程序。用户成功登录后,您希望显示应用程序的主视图(我们称之为 MainViewController)。

您不想将 LoginViewController 放入 UINavigationController 并随后将 MainViewController 推到它上面,因为没有理由将 LoginViewController 保持在堆栈底部,因为它永远不会再次显示。此外,在应用程序的后续启动中,您将确定您已经获得了某种登录令牌,并且根本不会显示 LoginViewController,因此从启动到启动导航控制器堆栈会出现不一致.

出于同样的原因,您也不希望从 LoginViewController 模态显示 MainViewController(如果它是模态的,它将保持 LoginViewController 加载在后面)。

您也不想将窗口的 rootViewController 设置为 MainViewController(之前设置为 LoginViewController),因为这不允许您进行转换。

我想要一些关于我上面的逻辑是否有缺陷的反馈,实际上这些场景之一是正确的吗?或者如果没有,其他人在为这种情况做了什么?

【问题讨论】:

【参考方案1】:

如果您没有登录令牌,为什么不将 MainViewController 设为您应用的根视图控制器,并在启动时以模态方式显示 LoginViewController?

【讨论】:

嗯好吧,这不是一个坏主意。但是我必须确保可以在没有有效登录会话的情况下创建 MainViewController,但我想因为它的视图最初不会显示(它会立即堆叠在上面),所以不会调用 viewDidLoad 和类似的函数还没有。 对此进行跟进...后退而不是前进。他们可能会认为从 Login 到 Main 的移动是向前的。想法? 我以前也这样做过。当您关闭 LoginViewController 时,您有多种选择来关闭它,而不仅仅是向右滑动。请参阅developer.apple.com/library/ios/#documentation/uikit/reference/… 和 modalTransitionStyle ..and @rickster 并不意味着将 LoginViewController 放在导航堆栈的顶部,他的意思是在 UINavigationController 上方使用 [UIViewController presentViewController:viewControllerToPresent:animated:completion:] 感谢您澄清@bandejapaisa 以及过渡样式的链接,这是有道理的。唯一的问题是,我想在 MainViewController 的 viewDidAppear 方法之前我不能呈现 LoginViewController 对吗?这意味着即使我在没有动画的情况下演示,在显示登录视图之前,主视图仍然会快速闪烁。解决方法?【参考方案2】:

我有这种应用程序,我通过删除作为当前对象的 LoginViewController 并添加 TabBarController 和 HomeViewController 来实现,就像这样

  /* remove the  current Login screen and show the 2nd tab */ 
    NSMutableArray* newArray = [NSMutableArray arrayWithArray:self.tabBarController.viewControllers];
    [newArray removeObject:self];
    [self.tabBarController setViewControllers:newArray animated:YES];

当使用从应用程序注销时,我创建登录屏幕并添加到堆栈中,否则直接进入 HomeViewController

当从应用程序中使用注销时,我将 LoginViewController 添加回堆栈并将 UITabBarController 的当前索引分配给 LoginViewController 类似这样的东西

 NSMutableArray *array =[NSMutableArray arrayWithObject:loginController];
        NSMutableArray* oldArray = [NSMutableArray arrayWithArray:self.tabBarController.viewControllers];
        [array addObjectsFromArray:oldArray];

        [self.tabBarController setViewControllers:array animated:YES];
        [self.tabBarController setSelectedIndex:0];

        self.tabBarController.tabBar.hidden=YES;

【讨论】:

我不确定我是否遵循 - 您的 LoginViewController 在 TabBarController 内吗?另外,你能用这个方法在屏幕之间切换吗? 是的 logincontroller 是 tabBarController 的一部分,我在多个应用程序中都没有问题,通过使用数组可以删除 loginController,注销后只需在第一个索引处再次添加它,这不是很困难的东西我必须说 好的,但是你如何指定过渡? 我使用这种方法与我的控制器进行转换-(CATransition*)addCustomAnimation CATransition *transition = [CATransition animation]; transition.duration = 0.5f; transition.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut]; transition.type = kCATransitionFade; return transition; & 当推动控制器或显示控制器时,将此转换设为默认 [self.tabBarController.view.layer addAnimation:[self addCustomAnimation] forKey:nil]; [self.tabBarController setViewControllers:newArray animated:NO];

以上是关于如何在不使用 UINavigationController 的情况下过渡到新的非模型视图控制器?的主要内容,如果未能解决你的问题,请参考以下文章

如何制作 UIImagePickerController StatusBar lightContent 样式?

如何在这个嵌套流中正确访问 tabBarController?

如何在不使用 AudioQueueRef 的情况下在 AudioQueue 中设置音量?

如何在不安装 Zend 框架的情况下使用 Zend 库

如何在不更改链接结构的情况下使用 \ 转义字符 (、)、[、]、*、_、:[]()

将 UINavigationController 添加到 UIPageViewController