UITabBar выбранная вкладка не меняет цвет оттенка при запуске - PullRequest
0 голосов
/ 22 февраля 2019

У меня есть подклассы 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)

Все в этом работает, кроме выбранного значка и заголовка.Когда приложение запускается, я вижу панель вкладок, первая иерархия представления (панель инструментов) видна на экране, и все вкладки работают правильно.Но значок и заголовок приборной панели находятся в невыбранном состоянии.Я должен фактически нажать на значок панели вкладок, чтобы получить состояние, чтобы изменить его так, чтобы оно было выбрано.

После нажатия на одну из вкладок выбранное состояние работает как обычно.Проблема только в первом представлении панели вкладок.

Вот изображение, показывающее начальное состояние панели вкладок при запуске.Обратите внимание, что значок панели инструментов не выбран, даже если это представленный контроллер представления.

broken tab bar icon, nothing selected

ОБНОВЛЕНИЕ

Ответ Skaal ниже решилпроблема для меня.

Для дальнейшего использования: ключевое различие между кодом, представленным здесь в моем вопросе, и его примером в ответе состоит в том, что tabBarItem установлен в viewDidLoad его пользовательского класса TabBarController,Напротив, этот код был помещен в метод viewDidLoad каждого класса контроллера составного представления в моем проекте.Должна существовать проблема синхронизации времени вызова, из-за которой цвет оттенка не может быть установлен в одном сценарии и работает правильно в другом.

Вывод ключа : Если вы настроилиКонтроллер панели вкладок программно, убедитесь, что вы установили свойства tabBarItem на ранней стадии, чтобы обеспечить правильную работу оттенков.

1 Ответ

0 голосов
/ 22 февраля 2019

Вы можете использовать:

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
    }
}
...