Скрыть панель навигации UINavigationController, когда корневым контроллером является UIHostingController
Я изо всех сил пытаюсь скрыть navigationBar
, который был бы правильно скрыт, если бы корневой контроллер не был SwiftUI UIHostingController
.
Я пробовал следующее:
Настройка
navigationController.isNavigationBarHidden = true
после его создания наviewDidLoad
а такжеviewWillAppear
.Добавление обоих
.navigationBarHidden(true)
а также.navigationBarBackButtonHidden(true)
дляUIHostingController
сrootView
.
Может это ошибка Apple? Я использую Xcode 11.6.
Все мои попытки вместе:
class LoginController: UINavigationController, ObservableObject
{
static var newAccount: LoginController
{
let controller = LoginController()
let view = LoginViewStep1()
.navigationBarHidden(true)
.navigationBarBackButtonHidden(true)
controller.viewControllers = [UIHostingController(rootView: view)]
controller.isNavigationBarHidden = true
return controller
}
override func viewWillAppear(_ animated: Bool)
{
super.viewWillAppear(animated)
self.isNavigationBarHidden = true
}
override func viewDidLoad()
{
super.viewDidLoad()
self.isNavigationBarHidden = true
}
}
struct LoginViewStep1: View
{
// ...
var body: some View
{
VStack {
// ...
}
.navigationBarHidden(true)
.navigationBarBackButtonHidden(true)
}
}
2 ответа
Решение
Вот решение. Протестировано с Xcode 11.4 / iOS 13.4
Изменил ваш код:
class LoginController: UINavigationController, ObservableObject
{
static var newAccount: LoginController
{
let controller = LoginController()
let view = LoginViewStep1()
controller.viewControllers = [UIHostingController(rootView: view)]
// make it delayed, so view hierarchy become constructed !!!
DispatchQueue.main.async {
controller.isNavigationBarHidden = true
}
return controller
}
}
struct LoginViewStep1: View
{
var body: some View
{
VStack {
Text("Hello World!")
}
}
}
испытанная часть в SceneDelegate
if let windowScene = scene as? UIWindowScene {
let window = UIWindow(windowScene: windowScene)
window.rootViewController = LoginController.newAccount
self.window = window
window.makeKeyAndVisible()
}
Альтернативное решение - использовать UINavigationControllerDelegate:
func navigationController(_ navigationController: UINavigationController, willShow viewController: UIViewController, animated: Bool) {
// Required because pushing UIHostingController makes the navigationBar appear again
isNavigationBarHidden = true
}
Протестировано с iOS 14.5 - Xcode 12.5