UITabBar 选定的选项卡在启动时不会更改色调颜色

UITabBar selected tab doesn't change tint color on launch

我已经 class 编辑了 UITabBarController 以允许对我的应用程序进行一些特定的自定义。它是我的 UIWindow 的根视图控制器并在启动时正确显示自身,甚至还显示正确的选项卡视图层次结构。

问题出在所选标签栏项目的色调上。在自定义选项卡栏控制器 subviewDidLoad 内 class,我为选项卡栏设置了未选择和已选择的色调。见下文:

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
}

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

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

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

点击其中一个选项卡后,所选状态将正常工作。问题仅出现在选项卡栏的第一个显示部分。

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

更新

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

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

要点:如果您以编程方式设置选项卡栏控制器,请务必尽早设置您的 tabBarItem 属性以确保色调颜色正常工作。

您可以使用:

selectedIndex = 0 // the index of your dashboardVC

而不是selectedViewController

EDIT - 这是 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
    }
}