我有一个在应用启动时显示的登录视图。在它加载之前的一瞬间,我看到它是父视图。我怎样才能阻止这个?
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 在视图绘制之前被调用。因此,如果您没有用户,它将在被绘制到屏幕之前呈现登录视图。
希望对你有帮助
【讨论】:
以上是关于我有一个在应用启动时显示的登录视图。在它加载之前的一瞬间,我看到它是父视图。我怎样才能阻止这个?的主要内容,如果未能解决你的问题,请参考以下文章