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

时间:2019-02-22 16:51:17

标签: ios swift uitabbarcontroller uitabbaritem

我已将UITabBarController子类化,以允许针对我的应用进行一些自定义。它是我的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)

除所选图标和标题外,所有其他操作均有效。启动应用程序后,我可以看到选项卡栏,第一个视图层次结构(仪表板)在屏幕上可见,并且所有选项卡均正常运行。但是仪表板的图标和标题处于 unselected 状态。我实际上必须点击选项卡栏图标以获取要更改的状态,以便将其选中。

点击选项卡之一后,所选状态将正常运行。问题仅出现在选项卡栏的第一个显示上。

这是显示启动时选项卡栏初始状态的图像。请注意,即使它是显示的视图控制器,也没有选择仪表板图标。

broken tab bar icon, nothing selected

更新

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

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

要点提示:如果您以编程方式设置了标签栏控制器,请务必尽早设置tabBarItem属性,以确保色调正确起作用。

1 个答案:

答案 0 :(得分: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
    }
}