如何在 UITabBarController 中加载所有视图?
Posted
技术标签:
【中文标题】如何在 UITabBarController 中加载所有视图?【英文标题】:How to load all views in UITabBarController? 【发布时间】:2016-01-20 14:17:45 【问题描述】:我没有在与此问题相关的帖子中找到相关且最新的答案。
我想在启动时加载所有视图控制器。目前它按预期启动,但是当我点击一个栏项(第一次)时,加载它时会有一点延迟,因为它还没有加载。
我怎么能用 Swift 做到这一点?
谢谢。
【问题讨论】:
【参考方案1】:要预加载UIViewController
的视图,只需访问其view
属性:
let _ = myViewController.view
要在UITabBarController
上预加载所有视图控制器,您可以:
if let viewControllers = tabBarController.viewControllers
for viewController in viewControllers
let _ = viewController.view
或者更简洁一点:
tabBarController.viewControllers?.forEach let _ = $0.view
【讨论】:
谢谢罗伯特,不幸的是我已经尝试过这个解决方案,并且 swift 给 viewController.view 一个错误:'Expression resolves to an unused l-value' 嗯,我没有收到那个错误。您可以尝试执行以下操作:let _ = viewController.view
是的,应该可以;在操场外使用时,我确实遇到了这个错误。我会更新答案...
当我尝试let _ = viewController.view
时,我没有收到错误消息,但是当我在 ViewControllers 的 viewdidload 方法中设置断点时,它似乎不起作用,直到我实际点击栏时才会调用它们物品。我尝试了您对 TabBarController 的 viewDidLoad 方法的建议是否正确?
@DanBeaulieu 是的;如果您使用的是故事板,那么标签栏控制器应该可以通过(window?.rootViewController as? UITabBarController)
(或类似的东西)访问。【参考方案2】:
结合 Robert 和 M. Daigle 的解决方案,我想出了这样的方法:
for viewController in tabBarController?.viewControllers ?? []
if let navigationVC = viewController as? UINavigationController, let rootVC = navigationVC.viewControllers.first
let _ = rootVC.view
else
let _ = viewController.view
将此添加到您的第一个 ViewController 的 ViewDidLoad 中,应该可以解决问题...
【讨论】:
【参考方案3】:上面罗伯特的回答对我有用,但我将 UINavigationControllers 作为每个选项卡的初始视图控制器。因此我不得不打电话
viewControllers.forEach $0.view
在我的 UINavigationControllers 中,以便同时加载它们的根视图控制器。希望对 Sam 有所帮助。
【讨论】:
【参考方案4】:如果你想同时准备提交和子控制器,你还必须调用viewWillAppear(Bool)
:
tabBarController.viewControllers?.forEach
let _ = $0.view
$0.viewWillAppear(true)
忽略这会导致视图位于导航栏和标签栏下方。
【讨论】:
以上是关于如何在 UITabBarController 中加载所有视图?的主要内容,如果未能解决你的问题,请参考以下文章
是否可以在 UITabBarController 内显示 SFSafariViewController?
如何在 UITabBarController 中向 UINavigationController 添加右键?
如何在 UINavigationController 中嵌入 UITabBarController?
如何从 View 获取数据到 UITabBarController