Swift и Xcode. Все UIViewControllers становятся черными при добавлении в TabBarController

#ios #swift #xcode

#iOS #swift #xcode

Вопрос:

Я пытаюсь создать UITabBarController программно, добавив к нему несколько NavigationControllers. Когда UITabBarController содержит один NavigationController — все работает как ожидалось (см. Изображение)

поведение ok

Но когда я добавляю несколько NavigationControllers в UITabBarController, каждый экран становится черным (см. Другое изображение)

поведение не в порядке

Такой же черный экран отображается при переключении между вкладками 1, 2, 3, 4 и 5.

Вот код, как создается UITabBarController

 class TabBarViewController : UITabBarController{

override func viewDidLoad() {
    super.viewDidLoad()

    let controllers = [HistoryViewController.self, StatsViewController.self, DashboardViewController.self, ExpenseManagerViewController.self, ProfileViewController.self]

    var navControllers: [UINavigationController] = []

    controllers.forEach{ ctrl in
        navControllers.append(getController(from: ctrl))
    }

    tabBar.tintColor = Color.green

    viewControllers = navControllers
}

private func getController<TType: UIViewController>(from type: TType.Type) -> UINavigationController{

    let ctrl = TType()
    let navCtrl = UINavigationController(rootViewController: ctrl)

    let ctrlName = String.init(describing: type.self).replacingOccurrences(of: "ViewController", with: String.empty)

    navCtrl.tabBarItem.title = ctrlName
    navCtrl.tabBarItem.image = UIImage(named: ctrlName)
    navCtrl.navigationBar.topItem?.title = ctrlName

    return navCtrl
}
}
  

Эти UIViewControllers создаются с использованием опции «добавить класс Cocoa Touch» и имеют файлы *.xib с некоторым минимальным дизайном (см. Еще Одно изображение)

список файлов

Любая помощь относительно того, почему все экраны становятся черными при нескольких (2 и более) NavigationControllers, добавленные в TabBarController, будут высоко оценены. Спасибо

Ответ №1:

Очевидно, вы забыли, как инициализировать UIViewControllers с помощью файла xib:

      private func getController<TType: UIViewController>(from type: TType.Type) -> UINavigationController{
  

пусть ctrl = TType(nibName: String.init(описание: type.self), bundle: nil)

     let navCtrl = UINavigationController(rootViewController: ctrl)
  

Комментарии:

1. Спасибо, это решает мою проблему. Но появляется новый. Розетки сейчас не работают, сообщая: *** Завершение приложения из-за неперехваченного исключения ‘NSUnknownKeyException’, причина: ‘[<UIViewController 0x7f874a435670> setValue:forUndefinedKey:]: этот класс не соответствует кодированию значения ключа для outletName

2. Решена моя проблема. Спасибо за ответ

Ответ №2:

Сначала, если вы заходите с любого экрана, не вставляйте navigationbar между этим viewcontroller и tabbarcontroller, а когда вы переходите к tabbarcontroller, установленному в качестве контроллера rootview, и любой вкладке, которую вы хотите открыть, чем поместить навигационный контроллер между ними. означает, что не открывайте контроллер tabbar с иерархией navigationbar, но когда вы хотите открыть контроллер с вкладками, поместите навигационный контроллер между ними.