何时启动/加载 UIViewController 元素(通过 Main.storyboard 中的 IB 创建)?
Posted
技术标签:
【中文标题】何时启动/加载 UIViewController 元素(通过 Main.storyboard 中的 IB 创建)?【英文标题】:When exactly are UIViewController elements ( created via IB in Main.storyboard ) initiated/loaded? 【发布时间】:2016-03-23 05:58:08 【问题描述】:在我的 viewController 中,大约有 15 个按钮是通过 Main.storyboard 中的 Interface Builder 创建的,其余的按钮是我以编程方式创建的。为避免延迟,我将大部分内容发送到后台线程,但所有 UI 内容,包括 15 个按钮,都没有,因为它们不是线程安全的。我想知道这 15 个按钮的确切加载时间。是在viewDidLoad
之前,在viewDidLoad
和viewDidAppear
之间,等等?此外,由于我仍然有一些延迟和屏幕冻结,我尝试在一个方法中初始化这个 UIViewController 的大部分内容,并在 AppDelegate 中调用这个方法,以便我将耗时的任务移到应用程序启动时(而且看起来真的为了提高性能和打印语句确实表明大多数繁重的代码是在应用程序启动时调用的,而不是在我展示视图控制器时调用)。
但是,每次我第一次获得这个 viewController 时,仍然会有一个初始的重载。当我回到 rootViewController 并再次回到这个 ViewController (通过 presentViewController(viewController, animated: false, completion:nil
on rootViewController 和 self.dismissViewController(animated:false, completion:nil)
on ViewController )时,我访问它的所有时间都不再冻结(这是我所有的来源痛苦......我不明白为什么我第一次访问 ViewController 时只花时间,而不是在第一次之后访问它的所有其他时间,即使所有 viewDidLoad, viewWillAppear, viewDidAppear
除了超级之外都没有代码类是必需的)。
因此,所有这些都让我怀疑这种最初的繁重负载是否来自通过 Interface Builder 创建的元素。这是我能想到的解释这种行为的唯一可能原因。这是 Instruments 屏幕截图,显示了我第一次访问 viewController 时负载很重的行为,并且每隔一次我在前面提到的第一次访问它时,只有一点不影响 UI 的小偷看(这是我想要的)时间。Instruments Sample Screenshot
【问题讨论】:
【参考方案1】:initWithNibName:bundle 将在 nib 加载之前被调用。它是发送到视图(或窗口)控制器以创建控制器的消息
initWithCoder 将在从情节提要(仅情节提要)加载期间被调用。这是一条发送给存档中每个对象以取消存档的消息。
awakeFromNib 将在 nib 加载后调用。它是在 nib 中的所有对象都已完全加载后,在连接其所有插座后发送给 nib 中的每个对象的消息笔尖中的连接。
【讨论】:
以上是关于何时启动/加载 UIViewController 元素(通过 Main.storyboard 中的 IB 创建)?的主要内容,如果未能解决你的问题,请参考以下文章
prepareForSegue 调用但不加载下一个 UIViewController
我可以观察 UIViewController 何时更改 interfaceOrientation 吗?