在 iOS 8 中不显示第一个视图控制器而转到另一个视图控制器

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

我正在尝试了解 iOS 中的新转折点 8. 我有一个应用程序,最初显示的是典型的登录屏幕,如果用户已登录,则不应显示该屏幕(即使是瞬间)并且用户应该在提要屏幕上,我正在从初始登录屏幕继续。

然而,我无法如愿以偿。首先,我只能使用 Present Modally 转场,因为它是唯一允许移除动画的合适转场。取决于我尝试在视图控制器生命周期中进行 segue 的位置,它要么在最初显示登录屏幕一瞬间后进行 segue,要么根本不进行 segue。

我对 viewDidAppear: 不太满意,因为它总是在显示初始视图控制器后执行。

我正在调查 viewDidLoadviewWillAppear: 但我在两者上都得到了这个(但没有任何反应):

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

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

请理解,Segue 只是 Presenting 和 Pushing controller 的现成开发,最初需要相当多的代码。 Segue 只是一种更简单的方法,无需编写太多代码来传递数据和设置其他控制器的属性等。

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

但我很确定,如果您尝试使用 Segue 进行此操作,您的 sourcController 将会出现,至少会出现一秒钟。

我已经开发了 50 多个应用程序,而且 UI 我可能还想开发更多。一开始,我也是这样做的 UI - 首先有登录控制器,然后做 seque,删除登录控制器.. 问题是如果你的导航树变得更复杂,将登录控制器作为你的根开始存在严重问题。

UI 调度员

所以我现在使用的是将我最常用的视图控制器作为我的根(在你的情况下,这将是提要 - 但它也可以是 TabBarVC,导航控制器等),并将登录控制器作为模态未以任何方式连接到该导航链的视图。然后,我有 Singleton 来控制应用程序中的 UI 流程(如果您有包含多个故事板的更大项目,我建议您这样做)。

单例所做的是在应用程序启动时,它会检查初始条件是否应该显示登录表单,如果是,它会从故事板中获取它(使用故事板 ID)+ 将其呈现为模态(非动画)。这样,登录在第一次抽奖时始终可见,但如果您不想,则不必这样做。您也不必更改导航树/初始视图控制器。

要从 Storyboard 中获取控制器,您可以使用这样的方法:

// --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- ---
// 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 tutorial on that topic (and also here),因此您可以查看它以了解一些有趣的东西,并可能使您的应用程序变得更好。

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