UITabBar 选择的选项卡在启动时不会改变色调颜色

Posted

技术标签:

【中文标题】UITabBar 选择的选项卡在启动时不会改变色调颜色【英文标题】:UITabBar selected tab doesn't change tint color on launch 【发布时间】:2019-02-22 16:51:17 【问题描述】:

我对@9​​87654323@ 进行了子类化,以允许针对我的应用进行一些自定义。它是我的UIWindow 的根视图控制器,并在启动时正确显示,甚至还显示正确的选项卡的视图层次结构。

问题在于所选标签栏项目的色调。在自定义标签栏控制器子类的viewDidLoad 中,我为标签栏设置了未选择和选定的色调颜色。见下文:

override func viewDidLoad() 
    super.viewDidLoad()

    tabBar.tintColor = .tabBarItemActiveTint
    tabBar.unselectedItemTintColor = .tabBarItemInactiveTint
    tabBar.barTintColor = .tabBarBg

    let dashboardVC = DashboardViewController.build()
    let settingsVC = SettingsTableViewController.build()
    let settingsNavC = UINavigationController(rootViewController: settingsVC)
    settingsNavC.navigationBar.barStyle = .black

    viewControllers = [dashboardVC, settingsNavC]
    selectedViewController = dashboardVC

    // Accessing the view property of each tab's root view controller forces
    // the system to run "viewDidLoad" which will configure the tab icon and
    // title in the tab bar.
    let _ = dashboardVC.view
    let _ = settingsVC.view

如您所见,控制器设置了其子视图层次结构,并且视图在底部加载,因此它们各自的viewDidLoad 方法在我有设置tabBarItem 的代码的位置运行。这是仪表板视图控制器的示例:

tabBarItem = UITabBarItem(title: "Dashboard", image: UIImage(named: Theme.dashboardTabBarIcon), tag: 0)

除了选定的图标和标题外,所有关于此的工作。当应用程序启动时,我可以看到选项卡栏,第一个视图层次结构(仪表板)在屏幕上可见,并且选项卡都正常运行。但是仪表板的图标和标题处于未选择状态。我必须实际点击标签栏图标才能更改状态以使其被选中。

点击其中一个选项卡后,所选状态将正常工作。问题仅出现在标签栏的第一次展示上。

这是一张显示标签栏在启动时的初始状态的图像。注意仪表板图标没有被选中,即使它是呈现的视图控制器。

更新

Skaal 下面的回答为我解决了这个问题。

供将来参考:我的问题中提供的代码与答案中的示例之间的主要区别在于 tabBarItem 是在他的自定义 TabBarController 类的 viewDidLoad 中设置的。相比之下,该代码被放置在我项目中每个组成视图控制器类的viewDidLoad 方法中。必须存在时间问题,即何时调用会导致色调颜色无法在一种情况下设置而在另一种情况下正常工作。

关键要点:如果您以编程方式设置标签栏控制器,请务必尽早设置 tabBarItem 属性以确保色调正常工作。

【问题讨论】:

【参考方案1】:

你可以使用:

selectedIndex = 0 // the index of your dashboardVC

而不是selectedViewController

编辑 - 这是UITabBarController 的工作示例:

class TabBarController: UITabBarController 

    private lazy var firstController: UIViewController = 
        let controller = UIViewController()
        controller.title = "First"
        controller.view.backgroundColor = .lightGray
        return controller
    ()

    private lazy var secondController: UIViewController = 
        let controller = UIViewController()
        controller.title = "Second"
        controller.view.backgroundColor = .darkGray
        return controller
    ()

    private var controllers: [UIViewController] 
        return [firstController, secondController]
    

    override func viewDidLoad() 
        super.viewDidLoad()

        tabBar.tintColor = .magenta
        tabBar.unselectedItemTintColor = .white
        tabBar.barTintColor = .black

        firstController.tabBarItem = UITabBarItem(title: "First", image: UIImage(), tag: 0) // replace with your image
        secondController.tabBarItem = UITabBarItem(title: "Second", image: UIImage(), tag: 1) // replace with your image

        viewControllers = controllers
        selectedViewController = firstController
    

【讨论】:

嗨,斯卡尔,谢谢。我实际上已经尝试过selectedViewControllerselectedIndex(分别尝试过,然后实际使用了两者)。他们都不会在启动时获得选定的选项卡来更改其色调。 嘿 FerrousGuy,我无法重现您的问题,所以我制作了一个示例,您可以尝试看看它是否适合您。我不知道你的问题是什么:/ 做到了!我已经修改了我的原始问题,以解释您的示例代码和我的项目中的代码之间的区别。非常感谢!

以上是关于UITabBar 选择的选项卡在启动时不会改变色调颜色的主要内容,如果未能解决你的问题,请参考以下文章

UITabBar 色调颜色不适用于图像

在 UITabBar 中为选定选项卡设置色调颜色

UITabBar 选择的色调颜色

Swift - 为啥我在选择时无法更改色调?

选择 UITabBar 项时打开另一个应用程序

在应用程序启动时预加载 UITabBar 选项卡时出现问题(崩溃)