在没有底层闪存的情况下,如何在视图出现之前执行Segue?

Posted

技术标签:

【中文标题】在没有底层闪存的情况下,如何在视图出现之前执行Segue?【英文标题】:How do I performSegue before the views appear without the under-layer flash? 【发布时间】:2015-02-10 06:34:34 【问题描述】:

我正在检查用户是否已登录。如果已登录,则跳过 LoginViewController(初始视图控制器),然后转到 MainViewController。

我已经尝试在 LoginViewController 的生命周期的无数地方进行此检查,而没有底层闪烁。

通过底层闪烁,我的意思是您可以在 MainViewController 出现之前看到 LoginViewController 的瞬间。

我已经解决了这 1 种方法,但感觉非常hacky:

在我的 LoginViewController 中:

override func viewDidLayoutSubviews() 
    super.viewDidLayoutSubviews()

    calls++

    if calls == 2 && NSUserDefaults.standardUserDefaults().objectForKey("AuthToken") != nil 
        self.performSegueWithIdentifier("loginUserNoAnim", sender: self)
    

“loginUserNoAnim”是我创建的没有动画的自定义 Segue。

viewDidLayoutSubviews() 在我的代码中被调用了 3 次。前两次,我收到警告说我的 ViewController 不在类似于此的窗口层次结构中:Warning: Attempt to present <PSLoginViewController: 0x1fda2b40> on <PSViewController: 0x1fda0720> whose view is not in the window hierarchy! 这会在 UI 中创建两个非常快速的白色闪烁。我通过检查通过 call 变量进行了多少次调用来摆脱它们。

现在,这是 100% hacky 并且不可接受。

有没有办法通过使用 ios 生命周期来解决这个问题?我什至尝试过使用 appdelegate 方法:

 func applicationDidBecomeActive(application: UIApplication) 
        // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface.
    

但我还是看到了底层闪光。缓解它的最佳方法是什么?

【问题讨论】:

事实上,我的“hack”是有缺陷的,因为你仍然可以看到它,但几乎没有 0.01 秒......但同样,它就在那里。 【参考方案1】:

我认为下面的 *** 答案很好地解释了如何在应用程序启动时在登录和主视图控制器之间切换:

Programmatically set the initial view controller using Storyboards

请注意,如果您在应用程序中提供退出功能,则应将用户引导至登录视图控制器,因为它仅在应用程序启动时检查。

【讨论】:

这些方法的问题是它们没有明确使用segue。出于某种原因,我需要为此使用 segue。我也宁愿通过 iOS 生命周期以某种方式管理它

以上是关于在没有底层闪存的情况下,如何在视图出现之前执行Segue?的主要内容,如果未能解决你的问题,请参考以下文章

如何在没有状态栏重叠的情况下在 iOS7 上呈现视图控制器

如何在没有代码的情况下隐藏 Android 布局 xml 中的部分可见视图?

java(TM)Platform SE binary 已停止工作是啥情况

如何在没有 HTML 标签的情况下从数据库中获取数据?

SwiftUI / iOS |在没有 NSNotification 的情况下获取键盘大小

如何在没有地图视图的情况下在自定义图像上显示用户位置