在我的 viewController 中,我有大约 15 个按钮是通过 Main.storyboard 中的 Interface Builder 创建的,其余按钮是我以编程方式创建的。为了避免延迟,我将大部分内容发送到后台线程,但所有 UI 内容,包括 15 个按钮,都不是,因为它们不是线程安全的。我想知道这 15 个按钮究竟是什么时候加载的。是在viewDidLoad
之前,在viewDidLoad
和viewDidAppear
之间,等等?此外,由于我仍然有一些延迟和屏幕卡住,我尝试在一个方法中初始化这个 UIViewController 的大部分内容,并在 AppDelegate 中调用这个方法,这样我就可以将耗时的任务转移到应用程序启动时(而且看起来确实如此为了提高性能,打印语句确实显示大部分繁重的代码是在应用程序启动时调用的,而不是在我呈现 View Controller 时调用的)。
但是,每次第一次拿到这个viewController,还是有一个初始的重载。当我回到 rootViewController 并再次回到这个 ViewController(通过 rootViewController 上的 presentViewController(viewController, animated: false, completion:nil
和 self.dismissViewController(animated:false, completion: nil)
在 ViewController 上),我访问它的所有后续时间都不再卡住(这是我所有痛苦的根源......我不明白为什么我第一次只需要时间访问 ViewController 而不是在我第一次访问它之后的所有其他时间,即使所有 viewDidLoad, viewWillAppear, viewDidAppear
除了需要的父类(super class)之外没有代码)。
因此,所有这一切让我怀疑这种初始的繁重负载是否可能来自通过 Interface Builder 创建的元素。这是我能想到的解释这种行为的唯一可能原因。这是 Instruments 屏幕截图,显示了我第一次访问 viewController 时负载很重的行为,而每次我在上述第一个之后访问它时,只有一点点不影响 UI 的行为(这是我想要的)时间。
Instruments Sample Screenshot
最佳答案
initWithNibName:bundle 将在 nib 加载之前被调用。它是发送到 View (或窗口) Controller 以创建 Controller 的消息
initWithCoder 将在从 Storyboard(仅 Storyboard)加载期间被调用。这是一条消息,发送到存档中的每个对象以取消存档。
awakeFromNib 将在 nib 加载后调用。它是在 nib 中的所有对象都已完全加载后,连接所有 outlet 后发送给 nib 中的每个对象的消息该 Nib 中的连接。
关于ios - UIViewController 元素(通过 IB 在 Main.storyboard 中创建)究竟何时启动/加载?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36170819/