Ios 如何在使用swift切换到视图控制器之前实例化和加载视图控制器

Ios 如何在使用swift切换到视图控制器之前实例化和加载视图控制器,ios,swift,load,segue,delay,Ios,Swift,Load,Segue,Delay,当我从viewController A转到viewController B时,出现了一个问题,在切换到它之前,它大约有5秒的延迟。我相信这是因为我在viewDidLoad中加载了大量的视图 我有一个xib文件,它有11个代表级别的部分的堆栈视图。每个部分都有一个按钮和一些图像,可以根据用户的进度进行更改 此外,我实例化了其中10个xib视图以加载到scrollview中。这一切都发生在viewDidLoad中。 我想知道我是否可以加载viewController B并在实际单击segue指

当我从viewController A转到viewController B时,出现了一个问题,在切换到它之前,它大约有5秒的延迟。我相信这是因为我在viewDidLoad中加载了大量的视图

我有一个xib文件,它有11个代表级别的部分的堆栈视图。每个部分都有一个按钮和一些图像,可以根据用户的进度进行更改

此外,我实例化了其中10个xib视图以加载到scrollview中。这一切都发生在viewDidLoad中。


我想知道我是否可以加载viewController B并在实际单击segue指向它的按钮之前准备好它;希望能解决我的延误。我也在使用与控制器之间的自定义分段

我能得到的任何帮助都很感激。我自己也研究过,但我发现大多数主题都过时了,或者不适用。再次感谢你的指点


更新:答案确实回答了我问题的一部分,关于如何准备一个视图控制器以提高效率,它没有回答延迟部分,但我想如果你阅读下面的评论,我就明白了答案

您可以将所有繁重的代码从
viewDidLoad()
移到某个自定义方法中

func prepare() {
 // Something hard 
}
您可以随时准备控制器并将其存储

var heavyController: HeavyViewController?

override func viewDidLoad() {
  super.viewDidLoad()
  heavyController = HeavyViewController()
  heavyController?.prepare()
}
而不仅仅是在segue中使用heavyController,而不是创建新的。希望这有帮助

考虑将重的代码部分移到后台线程中,可以检查./P> 更新: 要使用segue显示准备好的控制器,请执行以下操作:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier == "HeavyController" {
        present(heavyController, animated: true, completion: nil)
    }
}

我不认为延迟是由这么多视图造成的。或者您在这里提供了一些代码,说明如何创建vc2。不要认为您可以“预加载”视图控制器,因为生命周期是segues的低级功能。但是,如果你认为是加载的视图数量(不管是10个xib文件还是其他文件),你可以在VC A中加载它们,然后在prepare for segues函数中将它们发送给VC B。这看起来很简单。由于我使用的是自定义segue,并且我在Interface builder中设置了它,有没有办法将目标控制器更改为这个预先准备好的版本?因此我添加了prepare(用于segue),它可以在segue运行时工作,但是在为视图解包可选值时,我得到了find nil。我尝试在准备好的版本上添加loadView(),但没有效果。稍后我会继续关注这个问题,但感谢您,到目前为止,我觉得我走的是正确的道路。添加一些代码,也许我会告诉您发生这种情况的原因:)我添加了一个变量和函数,我可以从我的preppedVC运行该函数。所以segue工作,视图弹出,但是我在尝试更新的标签上得到了错误。将显示更新发生在视图中,以显示当前用户。如果我将其注释掉,那么在尝试更新滚动视图时,下一个错误也出现在我的滚动视图上。我真的不明白,因为视图显示,但错误是在更新时,所以如果我可以看到它,它怎么可能是零。。。我还没有正式搬起重物,我想在搬起重物之前把它摆正……通过打开和关闭不同的功能,我可以让赛格跑得更快。我想总的来说,这段时间我有很多事情要做,这会造成延迟。。。我想你在很大程度上回答了我关于预加载的问题,谢谢你。