我已将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 状态。我实际上必须点击选项卡栏图标以获取要更改的状态,以便将其选中。
点击选项卡之一后,所选状态将正常运行。问题仅出现在选项卡栏的第一个显示上。
这是显示启动时选项卡栏初始状态的图像。请注意,即使它是显示的视图控制器,也没有选择仪表板图标。
Skaal在下面的回答为我解决了这个问题。
供以后参考:我在此处提出的代码与答案中的示例之间的主要区别在于,tabBarItem
是在其自定义viewDidLoad
类的TabBarController
中设置的。相比之下,该代码放置在我项目中每个组成视图控制器类的viewDidLoad
方法中。一定有一个时间问题,即何时调用导致在一种情况下无法设置色调颜色而在另一种情况下无法正常工作的颜色。
要点提示:如果您以编程方式设置了标签栏控制器,请务必尽早设置tabBarItem
属性,以确保色调正确起作用。
答案 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
}
}