强制iOS上的viewDidLoad被触发

28

我有两个窗口应用程序,当我呈现第一个窗口时,我希望第二个窗口中的视图在后台加载和准备内容。

我尝试使用方法loadView,但苹果公司表示不应直接调用此方法。

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

是否有一种优雅的方法来强制ViewControllersviewDidLoad方法在应该自然发生之前触发(当窗口是关键且已呈现时)?

4个回答

58
你可以直接调用[viewController view];UIViewController文档解释了view属性是懒加载的,并且在加载视图后调用了viewDidLoad

6
如此简单而又如此有力 :) 谢谢! - Borut Tomazin
1
不错!起初我尝试使用viewController.view,但是它会出现警告。但是通过这种方式发送消息“view”却完全没有警告。 - Korey Hinton
这正是我所寻找的,但是否有关于它如何工作以及它的功能的文档/解释? - Spartacus9
1
@Spartacus9 是的,UIViewController文档解释了view属性是惰性加载的,并且在视图加载后调用viewDidLoad - Carl Veazey

34

iOS 9中,苹果终于解决了这个问题:

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

1
这就是真正的答案。 - klefevre

6

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

let viewController = MyCustomViewController()
_ = viewController.view

我正在尝试使用Swift,但它不起作用...这是因为iOS/Swift的新版本停止支持了吗? - Luccas Correa
你的“newer versions of iOS/Swift”是什么意思?指的是Swift 3.0吗?我还没有测试过Swift 3.0,所以不知道这种方法是否仍然有效。 - Thomás Pereira
我正在使用 Swift 2.2,但这对我不起作用... 我的代码和你的唯一区别是,我没有手动实例化视图控制器,而是调用故事板实例的 instantiateViewControllerWithIdentifier 方法。 - Luccas Correa
3
我的错,我正在实例化一个 NavigationController,这就是为什么它没有工作的原因...谢谢。 - Luccas Correa
1
好的,没问题。我刚测试并确认它仍然可以运行!;) - Thomás Pereira

0

你可以为该控制器(可能是在AppDelegate中)创建一个全局实例,然后调用你想执行操作的方法。然后,在推向该控制器时,不要创建新的实例,只需使用你已经创建的全局实例即可。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接