繁体   English   中英

在不显示iOS 8中的第一个视图控制器的情况下选择另一个视图控制器

[英]Segueing to another view controller without displaying the first in iOS 8

我试图了解iOS 8中的新功能。我有一个带有最初显示的典型登录屏幕的应用程序,如果用户已登录,则该屏幕不应显示(即使是瞬间),并且用户应位于供稿屏幕,我正在从初始登录屏幕中查找。

但是,我无法做我想做的事。 首先,我只能使用Present Modally segue,因为它是唯一允许删除动画的适当segue。 根据我尝试在视图控制器生命周期中进行筛选的位置,它要么在最初显示登录屏幕一秒钟后就进行筛选,要么根本不进行筛选。

我对viewDidAppear:感到不走运viewDidAppear:因为它将始终在显示初始视图控制器之后执行。

我正在研究viewDidLoadviewWillAppear:但我都得到了这一点(没有任何反应):

Warning: Attempt to present <UITabBarController: 0x12c617920> on <ViewController: 0x12c610590> whose view is not in the window hierarchy!

我如何在不显示初始视图控制器的情况下显示另一个视图控制器,即使是瞬间?

我已经开发了50多个具有更多UI的应用程序。 在一开始,我还以这种方式进行了UI的操作-首先具有登录控制器,然后再进行序列化操作,然后删除登录控制器。问题是,如果导航树变得越来越复杂,以登录控制器作为根就开始出现严重问题。

UI分派器

因此,我现在使用的是将最常用的视图控制器作为根(在您的情况下,将作为提要-但也可以是TabBarVC,导航控制器等),而登录控制器作为未连接的模式视图以任何方式进入该导航链。 然后,我有Singleton来控制应用程序中的UI流程(如果您的大型项目带有多个情节提要,建议您这样做)。

单例的作用是在应用程序启动时检查初始条件,是否应该显示登录表单,如果是,则从情节提要中获取(使用情节提要ID)+将其呈现为模态(不设置动画)。 这样,登录始终在第一个抽奖中可见,但是如果您不需要,则不必如此。 您也不必更改导航树/初始视图控制器。

要从情节提要中获取控制器,您可以使用以下方法:

// --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- ---
// MARK: - Login

func showLoginIfNeededAnimated(animated : Bool, completion : (() -> Void)?) {

    // Show login if user is not logged-in, for example
    if loginShouldAppearCondition {

        // Instantiate login VC from storyboard
        let storyboard : UIStoryboard = UIStoryboard(name: APPLICATION_UI_STORYBOARD_NAME_IPHONE_MAIN_FLOW, bundle: NSBundle.mainBundle())
        let loginVC : LoginVC = storyboard.instantiateViewControllerWithIdentifier(STORYBOARD_NAME_LOGIN) as! LoginVC

        // Present it
        self.baseController.presentViewController(baseNC, animated: animated, completion: completion)

        *Note - keep reference for login because of ARC!
    }
}

我注意到Facebook在他们的应用程序中使用了类似的东西,尽管我不确定它们的实现方式(由于它们制作动画的方式,在我看来我喜欢它)。

说到动画,您可以说它没有为您提供推送动画-好吧,您可以随时编写自己的动画,但也可以创建更多奇特的效果。 关于该主题( 以及此处 )有很棒的教程 ,因此您可以检查它以学习一些有趣的东西,并可能使您的应用程序更好。

希望对您有帮助,如果您有任何疑问,请问! 祝你好运 :)

请理解,Segue只是用于展示和推送控制器的现成开发,最初需要大量的代码。 Segue只是一种更简单的方法,无需编写太多代码即可传递数据和设置其他控制器的属性等。

如果segue没有sourceViewController和destinationViewController,则它是没有意义的。 并且由于它具有sourceViewController,因此需要加载它,因此它将始终显示...如果您需要了解如何使用特定控制器作为初始viewController来启动您的App,请了解如何设置Apps rootViewController。 。

但是我很确定,如果您尝试使用Segue进行操作,那么您的sourcController将会出现,至少要花一秒钟的时间。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM