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

Posted

技术标签:

【中文标题】在 iOS 8 中转到另一个视图控制器而不显示第一个视图控制器【英文标题】:Segueing to another view controller without displaying the first in iOS 8 【发布时间】:2015-07-20 10:29:53 【问题描述】:

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

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

我对@9​​87654321@ 不走运,因为它总是会在显示初始视图控制器后执行。

我正在调查viewDidLoadviewWillAppear:,但我都得到了这个(并且没有任何反应):

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

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

【问题讨论】:

【参考方案1】:

我已经开发了超过 50 个具有更多 UI 的应用程序,我可能希望这样做。一开始,我也是这样做的——首先有登录控制器,然后执行序列,删除登录控制器。问题是,如果你的导航树变得更复杂,将登录控制器作为你的 root 开始出现严重的问题。

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 在他们的应用程序中使用了类似的东西,但我不能确定他们的实现(我只是觉得他们喜欢它,因为他们做动画的方式)。

说到动画,你可以说它没有为你提供推送动画——好吧,如果你愿意,你总是可以自己写,但你也可以创造出更漂亮的效果。关于该主题的 great tutorial (and also here),因此您可以查看它以了解一些有趣的东西并可能使您的应用程序更好。

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

【讨论】:

我最终做了类似的事情。我已经使用了我的应用程序的初始“启动”屏幕(iOS 在 iOS 8 上加载应用程序时也使用它在屏幕上显示)并从那里路由。【参考方案2】:

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

如果没有sourceViewController 和destinationViewController,segue 是没有意义的。并且由于它有 sourceViewController,它需要被加载,因此会一直出现... .

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

【讨论】:

以上是关于在 iOS 8 中转到另一个视图控制器而不显示第一个视图控制器的主要内容,如果未能解决你的问题,请参考以下文章

Facebook iOS SDK - 跳转到另一个视图

IOS/Autolayout:在显示的控制器关闭后更改为显示视图

无法使用警报操作定向到另一个视图控制器

无法使用警报操作定向到另一个视图控制器

在 iOS 7 中更新导航栏而不更改视图

尝试在 iOS 8 中以横向模式而不是纵向模式显示键盘