查看另一个视图控制器而不显示iOS 8中的第一个

时间:2015-07-20 10:29:53

标签: ios ios8 storyboard segue uistoryboardsegue

我正在尝试了解iOS 8中的新segues。我有一个最初显示的典型登录屏幕的应用程序,如果用户已登录,则该屏幕不应显示(即使是瞬间),用户应该在我刚从初始登录屏幕看到的馈送屏幕上。

然而,我无法做我想做的事。首先,我只能使用Present Modally segue,因为它是唯一允许删除动画的segue。根据我在视图控制器生命周期中尝试偏离的位置,它可以在最初显示登录屏幕一段时间后进行分段,或者根本不进行分段。

我对viewDidAppear:感到不快,因为它会在显示初始视图控制器后始终执行。

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

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

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

2 个答案:

答案 0 :(得分:2)

我已经开发了超过50个应用程序和更多UI,我可能会喜欢。一开始,我也用这种方式做了UI - 首先登录控制器,然后做seque,删除登录控制器..问题是如果导航树变得越来越复杂,以root用户身份登录控制器开始出现严重问题。

UI调度程序

所以我现在使用的是将我最常用的视图控制器作为我的根(在你的情况下,这将是feed - 但它也可以是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 tutorialand also here),因此您可以检查它以了解有趣的内容,并可能使您的应用程序更好。

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

答案 1 :(得分:0)

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

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

但我很确定,如果你试图用Segue做这件事,你的sourcController会出现,至少会分裂一秒钟。