我有一个在应用启动时显示的登录视图。在它加载之前的一瞬间,我看到它是父视图。我怎样才能阻止这个?

Posted

技术标签:

【中文标题】我有一个在应用启动时显示的登录视图。在它加载之前的一瞬间,我看到它是父视图。我怎样才能阻止这个?【英文标题】:I have a login view that is presented on app launch. For a split second before it loads I see it's parent view. How can I stop this? 【发布时间】:2014-09-04 23:40:22 【问题描述】:

如果用户已注销,则会显示登录视图:

override func viewDidAppear(animated: Bool) 
    super.viewDidAppear(animated)
    if PFUser.currentUser() == nil 
        presentLoginViewController()
    


func presentLoginViewController() 
    let loginViewController = self.storyboard?.instantiateViewControllerWithIdentifier("loginViewControllerSB") as LoginViewController
    self.navigationController?.presentViewController(loginViewController, animated: false, completion: nil)

上述方法驻留在的控制器呈现登录视图控制器,因此显然需要在登录视图控制器呈现之前加载。移动到 viewDidLoad 或 viewWillAppear 没有任何区别,并且无论如何都会给我一个关于不平衡视图的警告。

我曾考虑从应用代理加载,但我仍然需要从视图加载,所以不确定如何做到这一点。

有什么想法吗?

感谢您的宝贵时间。

【问题讨论】:

【参考方案1】:

我的处理方式是:

我的 Storyboard 中有两个导航控制器流。一个默认连接为应用程序的根视图控制器。另一个是我的登录流程。

applicationDidFinishLaunchingWithOptions 中,我检查用户的凭据是否存在/有效。如果是,我什么也不做,所以我的标准应用程序流程就会发生。如果不是,我从情节提要中实例化登录视图控制器(使用instantiateViewControllerWithIdentifier)并将其设置为根视图控制器。

同时,我将我的应用代理设置为登录视图控制器的代理,以便它可以向我发送事件。

成功登录后(登录视图控制器通知应用程序委托),我重新实例化我的应用程序的“正常流程”视图控制器并将 那个重置为根视图控制器.

您可以通过自己制作动画来平滑这些视图控制器之间的过渡。例如,当我的登录流程完成后,这就是我在我的应用委托中重新实例化普通视图控制器的方式,因此我得到了一个很好的“翻转”。

        UIView.transitionWithView(
            window!,
            duration: 0.5,
            options: .TransitionFlipFromRight | UIViewAnimationOptions.AllowAnimatedContent | UIViewAnimationOptions.LayoutSubviews,
            animations: 
                self.window!.rootViewController = navigationController
            ,
            completion: nil
        )

整个方法似乎为登录视图控制器提供了一个很好的无故障流程,然后再次返回。

为了帮助说明,以下是我的 AppDelegate 中的两个相关函数:

func loginSuccessful() 
    assert(user.hasCredentials, "No credentials detected on successful login")

    if let navigationController = window?.rootViewController?.storyboard?.instantiateViewControllerWithIdentifier("homeNavigationController") as? UINavigationController 
        window?.rootViewController = navigationController

        UIView.transitionWithView(
            window!,
            duration: 0.5,
            options: .TransitionFlipFromRight | UIViewAnimationOptions.AllowAnimatedContent | UIViewAnimationOptions.LayoutSubviews,
            animations: 
                self.window!.rootViewController = navigationController
            ,
            completion: nil
        )

    


// Bits of our main flow (settings screen, etc.) can call this to notify us that our 
// credentials have been invalidated. We'll dump the main flow and pop up our
// login flow instead.
func credentialsInvalidated() 
    if let navigationController = window?.rootViewController?.storyboard?.instantiateViewControllerWithIdentifier("welcomeNavigationController") as? UINavigationController 

        if let welcomeViewController = navigationController.topViewController as? WelcomeViewController 
            welcomeViewController.delegate = self
        

        UIView.transitionWithView(
            self.window!,
            duration: 0.5,
            options: .TransitionFlipFromLeft | UIViewAnimationOptions.AllowAnimatedContent | UIViewAnimationOptions.LayoutSubviews,
            animations: 
                // Animate the navigation bar, too, otherwise it's a bit of a
                // jarring disappearance.
                navigationController.setNavigationBarHidden(true, animated: false)

                self.window!.rootViewController = navigationController
            ,
            completion: nil
        )
    

【讨论】:

一切都按预期工作,但动画没有任何反应,只是正常滑下。 人力资源部。似乎很奇怪。如果您在应用程序委托中替换窗口的根视图控制器,我希望它能够工作。如果有帮助,我将重现我的确切代码;它会包含你不需要的东西,但它可能有助于准确了解我在做什么。 这是我的委托方法的外观:pastebin.com/simXu92u didLogin() 在成功提交和登录表单时被触发。【参考方案2】:

我过去遇到过这个问题。一种解决方案是在您的初始视图控制器之前插入另一个视图控制器,以显示与您的启动图像匹配的视图(即 Default.png)。

然后,当它显示时,决定是显示您的登录屏幕还是您已经登录的屏幕。

【讨论】:

我喜欢这个想法,但马特有优势。在这种情况下,我原本想让我的应用代理负责。【参考方案3】:

viewWillAppear 中调用presentLoginViewController,而不是viewDidAppear。 viewWillAppear 在视图绘制之前被调用。因此,如果您没有用户,它将在被绘制到屏幕之前呈现登录视图。

希望对你有帮助

【讨论】:

以上是关于我有一个在应用启动时显示的登录视图。在它加载之前的一瞬间,我看到它是父视图。我怎样才能阻止这个?的主要内容,如果未能解决你的问题,请参考以下文章

标签栏选择swift中的索引

如何隐藏我的 Android 应用程序在加载时显示的“InstanceID 令牌:”框

如何创建实际加载广告时显示的不可见按钮[重复]

Flutter Web 中的启动画面

如何更改启动时显示的默认 SKScene

如何创建按下 UITableViewRowAction 时显示的编辑模式视图控制器?