为啥我的 UITabBar 在载入屏幕加载后消失?
Posted
技术标签:
【中文标题】为啥我的 UITabBar 在载入屏幕加载后消失?【英文标题】:Why does my UITabBar disappear after onboarding screen is loaded?为什么我的 UITabBar 在载入屏幕加载后消失? 【发布时间】:2019-02-12 08:55:13 【问题描述】:我正在使用Tab Bar Controller
,它工作正常,但是当我的应用程序第一次从我的入职屏幕启动以供用户接受 T&C 时,标签栏消失了。
我不太确定在这里做什么。这是我的代码:
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool
// Override point for customization after application launch.
//tnc screen ----------------------------------------------
let launchedBefore = UserDefaults.standard.bool(forKey: "hasLaunched")
self.window = UIWindow(frame: UIScreen.main.bounds)
let launchStoryboard = UIStoryboard(name: "Onboarding", bundle: nil)
let mainStoryboard = UIStoryboard (name: "Main", bundle: nil)
var vc: UIViewController
if launchedBefore
vc = mainStoryboard.instantiateInitialViewController()!
else
vc = launchStoryboard.instantiateViewController(withIdentifier: "FirstLaunch")
UserDefaults.standard.set(true, forKey: "hasLaunched")
self.window?.rootViewController = vc
self.window?.makeKeyAndVisible()
//end tnc screen ---------------------------------------------
我应该如何解决这个问题?
【问题讨论】:
我的猜测是,您的 mainStoryboard 中的 initialViewController 是您的 UITabBarController - 如果您将另一个 ViewController 设为您的 rootViewController,为什么 TabBarController 会出现呢?我认为您应该尝试从 TabBarController 显示您的“FirstLaunch” ViewController,而不是将其配置为 rootViewController @Teetz :啊,好吧,我想明白你在说什么。如果我错了,请纠正我,但这意味着我应该更改这部分代码:self.window?.rootViewController = vc
?
就像 Woodstock 展示了 ViewHierarchy。有更多方法可以实现您的需求,但我认为最好不要更改 rootViewController(rootViewController 始终是 TabBarController),您只需将 T&C ViewController 显示为 subView(从 TabBarController 呈现)
【参考方案1】:
这是因为您使用 T&C 故事板来掩盖您的 UITabBarController
故事板。
我倾向于完全放弃故事板,拥有一个根 UITabBarController
,并在其中一个 UIViewControllers
说 TabBarController
管理,添加一个子视图以接受条款和条件。
放弃情节提要如下所示:
UIWindow
--UITabBarController (the windows root view controller)
----UIViewController for tab 1
------UIView to show T&C
----UIViewController for tab 2
----UIViewController for tab n
【讨论】:
嗯,这是否意味着我应该将两者合并到 1 个故事板中?抱歉,我对此很陌生。 @AliWong 正是如此。或者,摆脱故事板(这是一种可视化的视图方式),而是以编程方式(在代码中)构建您的视图。你不需要故事板。您可以制作一个 UITabBarController,将其设置为您的 Windows rootVC,然后从那里添加更多内容。我会更新答案。 @AliWong 让我知道这是否有意义 哦,我明白了,这确实很有意义。但如果我这样做,当我第一次启动我的应用程序时,我能看到其他标签吗?另外,有没有办法让我用 Storyboard 做到这一点?我认为我不够熟悉以编程方式进行操作。 @AliWong 是的,如果您这样做的话,您在首次启动时会看到其他选项卡。您可以使用故事板来完成,但您需要将所有内容合二为一!希望这会有所帮助。【参考方案2】:我设法通过将其添加到我的同意按钮(在我的 tnc 的故事板上)来修复它:
let storyboard = UIStoryboard(name: "Main", bundle: nil)
self.present(homeVC, animated: true, completion: nil)*/
let controller = storyboard.instantiateViewController(withIdentifier: "TabBarController"); addChild(controller)
view.addSubview(controller.view)
controller.didMove(toParent: self)
非常感谢@Woodstock 和@Teetz 帮助我理解其背后的逻辑! :)
【讨论】:
以上是关于为啥我的 UITabBar 在载入屏幕加载后消失?的主要内容,如果未能解决你的问题,请参考以下文章
iOS 3 - 发生内存警告后,UITabBarItems 从 UITabBar 消失
UITableView中的UITabBar MoreViewController图像在以编程方式选择后消失
为啥在我的视图被推送到导航堆栈之前我的 UIAlertView 没有在屏幕上消失?