使用instantiateViewControllerWithIdentifier而不是performSegueWithIdentifier时出现延迟?

时间:2016-04-19 20:23:31

标签: ios swift uiviewcontroller uinavigationcontroller storyboard

以下代码用于将另一个视图控制器推送到导航堆栈。

当使用instantiateViewControllerWithIdentifier时,segue第一次(~3秒)显着缓慢但随后每次都发生得相当快。其他SO帖子建议确保在代码完成的主线程上发生segue,但这并没有解决问题。

但是,使用performSegueWithIdentifier不会导致延迟。

viewDidLoad的{​​{1}}代码对于第一次和后续推送都是相同的。

尝试为目标视图控制器清空SendViewController,但viewDidLoad仍存在延迟,但instantiateViewControllerWithIdentifier不存在延迟。

如何使用performSegueWithIdentifier确定延迟?

没有延迟:

instantiateViewControllerWithIdentifier

第一次显示SendViewController时出现延迟:

@IBAction func buttonTapped(sender: UIButton) {
    performSegueWithIdentifier(SendSegue, sender: self)  
}

3 个答案:

答案 0 :(得分:2)

在许多不同的场景中可能会发生此问题。确定导致特定问题的原因的最佳方法是使用Xcode中包含的仪器进行分析。

  1. 点击并按住xcode窗口中的构建按钮。您会看到四个选项,选择个人资料
  2. 一旦构建运行,将弹出一个带有乐器的窗口。从选项中选择时间分析
  3. 将出现一个新窗口,其中包含各种指标。左上角将有一个红色记录按钮。点击红色记录按钮,这将在手机上启动应用程序。
  4. 继续过渡,给你带来麻烦。通过选择与您开始录制的相同按钮,在转换发生后结束录制。
  5. 查看左下角的"详细信息" 窗格。您将看到一个标题为"运行时间" 的列,显示执行代码中的每个方法所花费的时间(操作系统方法和用户生成的代码)
  6. 确定是否有任何不适合或发生的情况。可能会返回并再次执行转换以比较两者之间的差异。单击列表中的功能将直接转到正在执行的代码。这可能非常有用。
  7. 如果转换需要3-5秒,则很可能在执行这些步骤时,一个特定功能将是显而易见的。快乐的分析!

    来自去年的WWDC在这方面也有很大的优势。这里值得一试:(仅在Safari中打开)WWDC Profiling Talk

答案 1 :(得分:1)

问题与目标视图控制器中存在UITextField是分离的,也就是说,删除UITextField会消除延迟。

然后它进一步被隔离到存在自定义字体。

换句话说,使用UITextField上的系统字体而不是自定义字体可以消除延迟。没有解释原因,但它确实有效。

答案 2 :(得分:0)

经过时间分析后,我意识到这是对instantiateViewController的调用,但找不到任何可以帮助我解决问题的方法。

不幸的是,唯一起作用的是要么为该视图控制器使用一个单独的情节提要板,然后从那里实例化它,要么以编程方式重做该视图控制器。