以下代码用于将另一个视图控制器推送到导航堆栈。
当使用instantiateViewControllerWithIdentifier
时,segue第一次(~3秒)显着缓慢但随后每次都发生得相当快。其他SO帖子建议确保在代码完成的主线程上发生segue,但这并没有解决问题。
但是,使用performSegueWithIdentifier
不会导致延迟。
viewDidLoad
的{{1}}代码对于第一次和后续推送都是相同的。
尝试为目标视图控制器清空SendViewController
,但viewDidLoad
仍存在延迟,但instantiateViewControllerWithIdentifier
不存在延迟。
如何使用performSegueWithIdentifier
确定延迟?
没有延迟:
instantiateViewControllerWithIdentifier
第一次显示SendViewController时出现延迟:
@IBAction func buttonTapped(sender: UIButton) {
performSegueWithIdentifier(SendSegue, sender: self)
}
答案 0 :(得分:2)
在许多不同的场景中可能会发生此问题。确定导致特定问题的原因的最佳方法是使用Xcode中包含的仪器进行分析。
如果转换需要3-5秒,则很可能在执行这些步骤时,一个特定功能将是显而易见的。快乐的分析!
来自去年的WWDC在这方面也有很大的优势。这里值得一试:(仅在Safari中打开)WWDC Profiling Talk答案 1 :(得分:1)
问题与目标视图控制器中存在UITextField是分离的,也就是说,删除UITextField会消除延迟。
然后它进一步被隔离到存在自定义字体。
换句话说,使用UITextField上的系统字体而不是自定义字体可以消除延迟。没有解释原因,但它确实有效。
答案 2 :(得分:0)
经过时间分析后,我意识到这是对instantiateViewController
的调用,但找不到任何可以帮助我解决问题的方法。
不幸的是,唯一起作用的是要么为该视图控制器使用一个单独的情节提要板,然后从那里实例化它,要么以编程方式重做该视图控制器。