Панель навигации не показывает iOS swift

у меня есть несколько контроллеров вида в моем приложении. Я хочу спрятаться!--3--> в моем первом контроллере просмотра. Поэтому я использую следующий код, чтобы скрыть панель навигации

navigationController?.setNavigationBarHidden(navigationController?.navigationBarHidden == false, animated: true);

теперь я хочу добавить панель навигации в другой viewController, но моя панель навигации не отображается в этом 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]
    }


}

Edit 1:

Я использую следующий код для перемещения с одного контроллера вида, а не ссылку с раскадровки. Это проблема сейчас?

 let storyboard = UIStoryboard(name: "Main", bundle: nil)
        let secondViewController = storyboard.instantiateViewControllerWithIdentifier("HomeVC")
        presentViewController(secondViewController, animated: false, completion: nil)

Edit 2:

пожалуйста, проверьте мои следующие скриншоты. Что мои настройки для контроллера secondview

enter image description here

enter image description here

Edit 3:

вот мой инспектор атрибутов навигационного контроллера enter image description here

7 ответов


навигационный Контроллер-это контроллер, который имеет стек вид контроллеров. Так что если у вас есть что-то вроде этого:

NAV - > A- > (segue) B

даже если вы скроете панель навигации, вы все равно сможете сделать сегменты. Также вы не можете просто отобразить панель навигации во втором (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 заменял навигационный контроллер, поэтому вы не могли видеть панель навигации.


override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)

    // Hide the navigation bar on the this view controller
    self.navigationController?.setNavigationBarHidden(true, animated: animated)
}

override func viewWillDisappear(_ animated: Bool) {
    super.viewWillDisappear(animated)

    // Show the navigation bar on other view controllers
    self.navigationController?.setNavigationBarHidden(false, animated: animated)
}

в методе viewDidLoad контроллера вида, в котором вы не хотите показывать панель навигации, добавьте строку

navigationController.navigationBarHidden = true

в настоящее время вы скрываетесь во всех контроллерах просмотра

Edit: вы представляете контроллер вида, вместо этого он должен быть

self.navigationController!.pushViewController(controller) 

у меня такое же требование в моем проекте swift.

вот как я обработал панель навигации

убедитесь, что ваш первый экран встроен в навигационный контроллер

enter image description here

пример у нас есть два экрана A и B

на экране A вам нужно скрыть панель навигации в viewWillAppear

override func viewWillAppear(animated: Bool)
    {
         super.viewWillAppear(animated)

        //hide navigation for screen A
        self.navigationController?.navigationBarHidden = true
    }

для включения навигации на экране B вам нужно добавить ниже код в экране

override func prepareForSegue(segue: (UIStoryboardSegue!), sender: AnyObject!)
    {
        if (segue.identifier == "screen B's segue identifier here")
        {
           //enable navigation for screen B       
            navigationController?.setNavigationBarHidden(navigationController?.navigationBarHidden == false, animated: true)
        }

    }

используя стиль выше, я могу включить или отключить панель навигации для определенного экрана, когда захочу


Если вам нужно, чтобы эта панель навигации была скрыта только в этом контроллере, лучший способ-показать ее в viewWillDisappear() и спрятать в viewWillAppear().


слишком поздно отвечать, и есть другие хорошие ответы, но я хотел бы поделиться тем, что сработало для меня.

let controller = self.storyboard?.instantiateViewControllerWithIdentifier("HomeVC")
    self.navigationController!.pushViewController(controller!, animated:true)

люблю в 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
}