干净的方式来强制视图加载子视图提前

最近,我写了一些代码,我试图引用一个UIViewController的出口,我刚刚实例化了[storyboard instantiateViewControllerWithIdentifier]并修改了在呈现ViewController之前出口指向的子视图。 它没有工作,因为ViewController的视图还没有加载它的子视图,包括我的sockets引用的,所以属性只给了我一个空指针。

在debugging器中跟踪我的问题的原因后,我search了一下,并通过像这样的答案了解到,我可以通过调用myViewController.view getter来导致视图加载其子视图而不显示。 之后,我可以毫无问题地进入我的店。

然而,这是一个明显的黑客攻击,Xcode – 非常正确地 – 不喜欢它,愤怒地抗议这个警告:

未使用的属性访问结果 – 吸气剂不应该用于副作用

是否有一个非hacky替代方法来做到这一点,不涉及滥用.view getter? 另外,是否有这种情况下的规范/惯用模式涉及到像加载子视图时dynamic添加处理程序被调用的东西?

或者是标准的解决scheme只是用[myViewController view]replacemyViewController.view来closuresXcode的警告,然后与黑客生活?

在iOS 9或更新版本上,可以使用:

 viewController.loadViewIfNeeded() 

文档: https : //developer.apple.com/reference/uikit/uiviewcontroller/1621446-loadviewifneeded

我同意强制加载视图应该避免,但我碰到一个情况下,似乎是一个问题的唯一合理的解决scheme(popupUINavigationController包含一个UISearchController尚未被调用导致一个讨厌的控制台说警告)。

我所做的是使用新的iOS9 API loadViewIfNeeded和iOS9以前使用viewController.view.alpha = 1.0。 当然,这个代码之上的好评可能会阻止你(或其他人)以后认为这个代码是不需要的。

苹果现在提供这个API的事实表明,它可能需要时不时。

合并了Rudolph / Swany的ios9预先部署目标

  if #available(iOS 9.0, *) { loadViewIfNeeded() } else { // _ = self.view works but some Swift compiler genius could optimize what seems like a noop out // hence this perversion from this recipe http://stackoverflow.com/questions/17279604/clean-way-to-force-view-to-load-subviews-early view.alpha = 1 } 

如果我理解正确,我认为还有一个相当标准的解决scheme:将sockets修改/configuration代码移到最近实例化的VC的viewDidLoad方法中。

这个问题也讨论了这个话题。

这将需要一些重组,但如果你的VC处理自己的configuration,它可能会给你一个“清洁”的MVC方面的devise,它将避免“你不应该直接调用此方法”在loadView狭窄。

你可以调用[myViewController loadView]显式的加载视图,而不是滥用.view getter。 如果需要的话, .view getter实际上会调用loadView

这仍然不是一个很好的解决scheme,因为UIView文档的loadView部分明确指出

你不应该直接调用这个方法