【发布时间】:2016-08-12 05:46:38
【问题描述】:
下面的代码用于将另一个视图控制器推送到导航堆栈。
当使用instantiateViewControllerWithIdentifier 时,segue 第一次明显迟缓(约 3 秒),但随后每次都发生得相当快。其他 SO 帖子建议确保 segue 发生在代码完成的主线程上,但这并没有解决问题。
但是,使用performSegueWithIdentifier 不会导致延迟。
SendViewController 的 viewDidLoad 代码对于第一次和后续推送是相同的。
尝试为目标视图控制器清除 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)
}
}
【问题讨论】:
-
目标视图控制器的 viewDidLoad 和 viewWillAppear 方法到底发生了什么?
-
@arturdev 没有覆盖 viewWillAppear。在 viewDidLoad 中只有代理设置和隐藏/显示 UI 元素,更重要的是代码每次都是相同的(即第一次和随后的显示之间没有区别)。有什么建议吗?
-
那里有网络请求吗?或任何
[UIImage imageNamed:]电话? -
@arturdev 没有网络调用,也没有 UIImage 调用。感谢您的帮助!
-
然后尝试从该按钮中删除所有操作,然后重新连接。我知道这很奇怪,但有时它对我有用:)
标签: ios swift uiviewcontroller uinavigationcontroller storyboard