Навигационная панель, не показывающая iOS swift
В моем приложении есть несколько контроллеров. Я хочу скрыть navigationbar
в моем первом контроллере представления. Поэтому я использую следующий код, чтобы скрыть панель навигации
navigationController?.setNavigationBarHidden(navigationController?.navigationBarHidden == false, animated: true);
Теперь я хочу добавить панель навигации в какой-то другой viewController, но моя панель навигации не отображается в этом диспетчере просмотра. Почему это происходит?
Моя раскадровка, показывающая панель навигации, но как только я пытаюсь запустить мое приложение, она ушла.
Если я скрою панель навигации с одного контроллера вида, мы не сможем использовать контроллер навигации, не так ли? Надеюсь, я ошибаюсь. Тогда какие причины для навигации не отображаются?
EDIT:
Также я хочу, чтобы мой контроллер просмотра только в портретном режиме. Итак, я сделал следующее: это вызывает проблему?
extension UINavigationController{
public override func shouldAutorotate() -> Bool {
if (UIDevice.currentDevice().orientation == UIDeviceOrientation.LandscapeLeft ||
UIDevice.currentDevice().orientation == UIDeviceOrientation.LandscapeRight ||
UIDevice.currentDevice().orientation == UIDeviceOrientation.Unknown) {
return false
}
else {
return true
}
}
public override func supportedInterfaceOrientations() -> UIInterfaceOrientationMask {
return [UIInterfaceOrientationMask.Portrait ,UIInterfaceOrientationMask.PortraitUpsideDown]
}
}
Изменить 1:
Я использую следующий код для перехода с одного контроллера просмотра, а не на ссылку из раскадровки. Это проблема?
let storyboard = UIStoryboard(name: "Main", bundle: nil)
let secondViewController = storyboard.instantiateViewControllerWithIdentifier("HomeVC")
presentViewController(secondViewController, animated: false, completion: nil)
Изменить 2:
Пожалуйста, проверьте мои следующие снимки экрана. Каковы мои настройки для контроллера второго взгляда
![введите описание изображения здесь]()
![введите описание изображения здесь]()
Изменить 3:
Вот мой инспектор атрибутов контроллера навигации
![введите описание изображения здесь]()
Ответы
Ответ 1
Контроллер навигации - это контроллер, в котором есть стек контроллеров. Поэтому, если у вас есть что-то вроде этого:
NAV → A → (segue) B
Даже если вы скроете навигационную панель, вы все равно сможете сделать segues. Также не можете ли вы просто отобразить навигационную панель во втором (B) контроллере просмотра в viewWillAppear? И сначала скрыть его на viewWillAppear.
edit: окончательное решение проблемы:
Использование:
let controller = storyboard.instantiateViewControllerWithIdentifier("HomeVC")
self.navigationController!.pushViewController(controller)
вместо:
let secondViewController = storyboard.instantiateViewControllerWithIdentifier("HomeVC")
presentViewController(secondViewController, animated: false, completion: nil)
Поскольку pushViewController добавит secondViewController в свой стек. presentViewController заменил ваш контроллер навигации, поэтому вы не могли видеть панель навигации.
Ответ 2
сделайте, как в viewcontroller
скрытый
для скрытия navigationController
в viewWillAppear
override func viewWillAppear(animated: Bool) {
super.viewWillAppear(animated)
self.navigationController?.navigationBarHidden = true
}
для отображения navigationController
в viewWillDisappear
override func viewWillDisappear(animated: Bool)
{
super.viewWillDisappear(animated)
self.navigationController?.navigationBarHidden = false
}
Ответ 3
в режиме viewDidLoad контроллера вида, в котором вы не хотите показывать навигационную панель, добавьте строку
navigationController.navigationBarHidden = true
вы сейчас скрываетесь во всех контроллерах представления
Изменить: вы представляете контроллер представления, а не
self.navigationController!.pushViewController(controller)
Ответ 4
У меня такое же требование в моем стремительном проекте.
так я обработал панель навигации
Убедитесь, что ваш первый экран встроен в контроллер навигации
![введите описание изображения здесь]()
Например, у нас есть два экрана A и B
На экране A вам нужно скрыть панель навигации в viewWillAppear
override func viewWillAppear(animated: Bool)
{
super.viewWillAppear(animated)
//hide navigation for screen A
self.navigationController?.navigationBarHidden = true
}
для включения навигации на экране B
вам нужно добавить код ниже на экране A
override func prepareForSegue(segue: (UIStoryboardSegue!), sender: AnyObject!)
{
if (segue.identifier == "screen B segue identifier here")
{
//enable navigation for screen B
navigationController?.setNavigationBarHidden(navigationController?.navigationBarHidden == false, animated: true)
}
}
Используя вышеприведенный стиль, я могу включить или отключить панель навигации для конкретного экрана, когда захочу
Ответ 5
Если вам нужно, чтобы эта панель навигации была скрыта только в этом контроллере, лучший способ - показать ее в viewWillDisappear()
и скрыть в viewWillAppear()
.
Ответ 6
Слишком поздно, чтобы ответить, и есть другие хорошие ответы, но я хотел бы поделиться тем, что сработало для меня.
let controller = self.storyboard?.instantiateViewControllerWithIdentifier("HomeVC")
self.navigationController!.pushViewController(controller!, animated:true)
Ответ 7
делать в скрытом viewcontroller
с помощью Swift 4.0
Чтобы скрыть navigationController
в viewWillAppear
override func viewWillAppear(animated: Bool) {
super.viewWillAppear(animated)
self.navigationController?.isNavigationBarHidden = true
}
Чтобы отобразить navigationController
в viewWillDisappear
override func viewWillDisappear(animated: Bool)
{
super.viewWillDisappear(animated)
self.navigationController?.isNavigationBarHidden = false
}