Я столкнулся с точно такой же проблемой, когда приложение было спроектировано с одним контроллером навигации на вкладку. Самым простым нехакерским способом, который я нашел, чтобы это исправить, было поместить UITabBarController
внутрь UINavigationController
и удалить отдельных UINavigationController
s.
До:
-> UINavigationController -> UIViewController
-> UINavigationController -> UIViewController
UITabBarController -> UINavigationController -> UIViewController
-> UINavigationController -> UIViewController
-> UINavigationController -> UIViewController
После того, как:
-> UIViewController
-> UIViewController
UINavigationController -> UITabBarController -> UIViewController
-> UIViewController
-> UIViewController
Используя внешний UINavigationController
, вам не нужно скрывать UITabBar
при помещении контроллера вида в стек навигации.
Оговорка:
Единственная проблема, которую я до сих пор обнаружил, заключается в том, что установка элементов заголовка или кнопок правой / левой панели на каждом UIViewController
не имеет такого же эффекта. Чтобы преодолеть эту проблему, я применил изменения через UITabBarControllerDelegate
, когда изменилось видимое UIViewController
.
func tabBarController(_ tabBarController: UITabBarController, didSelect viewController: UIViewController) {
guard let topItem = self.navigationController?.navigationBar.topItem else { return }
precondition(self.navigationController == viewController.navigationController, "Navigation controllers do not match. The following changes might result in unexpected behaviour.")
topItem.title = viewController.title
topItem.titleView = viewController.navigationItem.titleView
topItem.leftBarButtonItem = viewController.navigationItem.leftBarButtonItem
topItem.rightBarButtonItem = viewController.navigationItem.rightBarButtonItem
}
Обратите внимание, что я добавил preconditionFailure
, чтобы поймать любой случай, когда архитектура навигации была изменена