提问人:Mark Amery 提问时间:6/24/2013 最后编辑:CommunityMark Amery 更新时间:2/25/2019 访问量:11685
强制视图提前加载子视图的简洁方法
Clean way to force view to load subviews early
问:
最近我写了一些代码,我试图在我刚刚实例化的 a 上引用一个 outlet,并在显示 .它不起作用,因为 的视图尚未加载其子视图,包括我的出口引用的子视图,因此该属性只是给了我一个空指针。UIViewController
[storyboard instantiateViewControllerWithIdentifier]
ViewController
ViewController
在(经过一些挣扎)在调试器中追踪我的问题原因之后,我用谷歌搜索了一下,并通过这样的答案了解到,我可以通过调用 getter 使视图加载其子视图而不显示。之后,我可以毫无问题地访问我的插座。myViewController.view
不过,这是一个明显的黑客攻击,Xcode - 非常正确地 - 不喜欢它,并愤怒地抗议这个警告:
未使用的属性访问结果 - 不应将 getter 用于副作用
有没有一种非黑客的替代方法可以做到这一点,而不涉及滥用 getter?或者,此方案是否有规范/惯用模式,涉及动态添加要在加载子视图后立即调用的处理程序?.view
还是标准解决方案只是替换为关闭 Xcode 的警告,然后忍受黑客攻击?myViewController.view
[myViewController view]
答:
您可以调用以显式加载视图,而不是滥用 getter。如果有必要,getter 实际上会在调用时调用。[myViewController loadView]
.view
.view
loadView
这仍然不是一个非常好的解决方案,因为 UIView 文档的loadView
切勿直接调用此方法
评论
[myViewController view]
loadView
如果我理解正确的话,我认为还有另一个相当标准的解决方案:将出口修改/配置代码移动到(最近实例化的 VC)的方法中。viewDidLoad
这个问题也讨论了这个话题。
这需要一些重组,但如果你传入的 VC 处理自己的配置,它可能会在 MVC 方面给你一个“更干净”的设计,并且它会避免 “你永远不应该直接调用此方法” 的限制。loadView
评论
viewDidLoad
BOOL isInitialized
viewDidLoad
我同意应该避免强制加载视图,但我遇到了一种情况,它似乎是解决问题的唯一合理解决方案(弹出包含尚未调用的 UISearchController 的 UINavigationController 会导致讨厌的控制台说警告)。
我所做的是使用新的 iOS9 API loadViewIfNeeded,并且在 iOS9 之前使用 viewController.view.alpha = 1.0。当然,在此代码上方的良好注释将防止您(或其他人)以后认为不需要此代码。
Apple 现在提供此 API 这一事实表明,有时可能需要它。
在 iOS 9 或更高版本上,可以使用:
viewController.loadViewIfNeeded()
文档:https://developer.apple.com/reference/uikit/uiviewcontroller/1621446-loadviewifneeded
评论
viewDidLoad
中。
合并了 ios9 之前部署目标的 Rudolph/Swany 答案
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
}
评论
不确定这种方式有多干净,但它仍然工作正常:
_ = vc.view
UPD:为了方便起见,您可以像下面这样声明扩展:
extension UIViewController {
func preloadView() {
let _ = view
}
}
您可以通过以下 URL 阅读说明:https://www.natashatherobot.com/ios-testing-view-controllers-swift/
评论