下面的代码用于将另一个视图控制器推入导航堆栈。
使用时instantiateViewControllerWithIdentifier,第一次的速度明显较慢(〜3秒),但随后的每次速度都相当快。其他SO职位建议确保序号发生在代码完成的主线程上,但这不能解决问题。
instantiateViewControllerWithIdentifier
但是,使用performSegueWithIdentifier不会引起延迟。
performSegueWithIdentifier
第一次和后续推送的viewDidLoad代码SendViewController相同。
viewDidLoad
SendViewController
尝试消隐viewDidLoad目标视图控制器,但仍然存在,instantiateViewControllerWithIdentifier但不存在滞后performSegueWithIdentifier。
如何解决延迟instantiateViewControllerWithIdentifier?
没有延迟:
@IBAction func buttonTapped(sender: UIButton) { performSegueWithIdentifier(SendSegue, sender: self) }
首次显示SendViewController时导致延迟:
@IBAction func buttonTapped(sender: UIButton) { dispatch_async(dispatch_get_main_queue()) { let vc = self.storyboard!.instantiateViewControllerWithIdentifier(self.SendViewControllerID) as! SendViewController self.navigationController!.pushViewController(vc, animated: true) } }
问题被隔离到目标视图控制器中存在UITextField,也就是说,删除UITextField可以消除滞后。
然后,将其进一步隔离为存在自定义字体。
换句话说,在UITextField上使用系统字体而不是自定义字体可以消除延迟。没有解释为什么,但是有效。