2015-07-20 50 views
0

我想了解在iOS 8中的新segues。我有一个典型的登录屏幕最初显示的应用程序,如果用户登录,该屏幕应该不显示(即使是一瞬间),用户应该在饲料屏幕上,我从初始登录屏幕继续。接近另一个视图控制器,而不显示第一个iOS 8

但是,我无法做我想做的事。首先,我只能使用Present Modally Segue,因为它是唯一允许删除动画的合适的细节。根据我试图在视图控制器生命周期中延续的地方,它会在最初显示一秒钟的登录屏幕后继续进行,或者根本不会继续。

我与viewDidAppear:运气不好,因为它会始终在显示初始视图控制器后执行。

我期待到viewDidLoadviewWillAppear:但我得到这两个(和没有任何反应):

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

我怎样才能不显示初始视图控制器显示另一个视图控制器,甚至一秒钟?

回答

2

我已经开发了超过50个应用程序与更多的用户界面,我可能会喜欢。在开始时,我也是这样做了用户界面 - 先登录控制器,然后执行seque,删除登录控制器。问题是,如果导航树变得更加复杂,以登录控制器作为根开始出现严重问题。

UI调度

因此,我现在用的是有我最常用的视图控制器作为我的根(在你的情况,这将是饲料 - 但它也可以是TabBarVC,导航控制器等。 )和登录控制器作为模式视图,但不以任何方式连接到该导航链。然后,我有Singleton来控制应用程序中的UI流程(如果你有多个故事板的更大的项目,我建议你这样做)。单身人士做的是,在应用程序启动时,它检查初始条件是否应该呈现登录表单,如果是,则从故事板抓取(使用Storyboard 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的使用类似的东西在自己的应用程序,虽然我不能肯定他们实现(我只是在我看来,喜欢它是因为他们如何做动画)。说到动画,你可以说它不会为你提供推动动画 - 呃,如果你愿意的话,你可以随时编写自己的动画,但是你也可以创造更多更漂亮的效果。这个主题上有great tutorialand also here),所以你可以检查它学习一些有趣的东西,并可能使你的应用程序更好。

希望它可以帮助你,如果你有任何问题,请问!祝你好运:)

+0

我最终做了类似的事情。我利用了我的应用程序的初始“启动”屏幕(iOS也用它在iOS 8上加载应用程序时显示在屏幕上)并从那里发送。 –

0

请理解Segue只是一个现成的开发环境,用于呈现和推动控制器,最初需要大量的代码。塞格只是一个简单的方法来做到这一点,而无需编写太多的代码来传递数据和设置其他控制器的属性等。

如果segue没有sourceViewController和destinationViewController,则segue没有意义。因为它有sourceViewController,所以它需要加载,因此总是会出现...如果您需要知道如何启动您的应用程序作为您的初始viewController特定的控制器,请看看如何设置您的应用程序rootViewController ..

但是我很肯定,如果你试图用Segue来做,你的sourcController将会出现,至少是第二个分割。

相关问题