强制 viewDidLoad 在 iOS 上触发

Posted

技术标签:

【中文标题】强制 viewDidLoad 在 iOS 上触发【英文标题】:Force viewDidLoad to fire on iOS 【发布时间】:2012-10-03 07:21:44 【问题描述】:

我有两个窗口应用程序,当我展示第一个窗口时,我希望第二个窗口中的视图能够加载并为稍后在后台准备内容。

我尝试使用方法loadView,但Apple 说你不应该直接调用这个方法。

到目前为止,我选择使用视图的方法userInteractionEnabled,它实际上是隐式的 调用viewDidLoad 方法。

有没有一种优雅的方法可以强制 ViewControllers viewDidLoad 方法在它应该自然触发之前触发(当窗口是关键并呈现时)?

【问题讨论】:

【参考方案1】:

您可以拨打[viewController view];

documentation for UIViewController 解释了如何延迟加载视图属性以及在加载视图后调用viewDidLoad

【讨论】:

如此简单却如此强大:) 谢谢! 不错!起初我尝试了 viewController.view,但它发出了警告,但以这种方式发送消息“view”根本不会发出警告 这正是我所寻找的,但是否有关于其工作原理和作用的文档/说明? @Spartacus9 是的,documentation for UIViewController 解释了 view 属性是如何延迟加载的,并且 viewDidLoad 在视图加载后被调用。【参考方案2】:

ios 9 中,Apple 终于解决了这个问题:

// Loads the view controller's view if it has not already been set.
@available(iOS 9.0, *)
public func loadViewIfNeeded()

【讨论】:

这是真正的答案【参考方案3】:

Swift 2.0,与@Carl Veazey 解决方案的结果相同:

let viewController = MyCustomViewController()
_ = viewController.view

【讨论】:

我正在用 swift 尝试这个,但它不工作......这是否停止与较新版本的 iOS/Swift 一起工作? “较新版本的 iOS/Swift”是什么意思?斯威夫特 3.0?我还没有测试 Swift 3.0,所以我不知道这种方法是否仍然有效。 我正在使用 swift 2.2,这对我不起作用......我的代码和你的代码之间的唯一区别是,我没有自己实例化 View Controller,而是调用方法 instantiateViewControllerWithIdentifier故事板实例。 我的错,我正在实例化一个 NavigationController,这就是它不起作用的原因......谢谢 好的,没问题。我刚刚测试并确认它仍然有效! ;)【参考方案4】:

您可以为该控制器创建一个全局实例(可能在AppDelegate 中)并调用您想要执行操作的方法。然后在推送到该控制器时不要创建新实例只需使用您创建的实例供全局使用。

【讨论】:

以上是关于强制 viewDidLoad 在 iOS 上触发的主要内容,如果未能解决你的问题,请参考以下文章

iOS:如何知道 viewDidLoad 是不是被调用?

是否有可能强制Ios浏览器从输入焦点到另一个元素?

在 iOS 7 上,在 viewDidLoad 中设置图层变换会破坏自动布局

推送到新的 UIViewController 后强制再次调用 viewDidLoad

在 iOS 上,当某些维度信息不可用时,我们如何在 viewDidLoad 中的屏幕上绘制东西?

iOS 和 Swift:可以强制解开 tableView.indexPath?