为啥我的 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,并在其中一个 UIViewControllersTabBarController 管理,添加一个子视图以接受条款和条件。

放弃情节提要如下所示:

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 没有在屏幕上消失?

单击按钮时UITabbar消失

UITabBar 中的 UICollectionView 在首次加载时显示错误的位置

绿色加载屏幕后登录 Google Play 消失。如何解决?