首页 文章

导航栏没有显示iOS swift

提问于
浏览
13

我的应用程序中有多个视图控制器 . 我想在我的第一个视图控制器中隐藏 navigationbar . 所以我使用以下代码隐藏导航栏

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 回答

  • 29

    导航控制器是一个控制器,它有一堆视图控制器 . 所以,如果你有这样的事情:

    NAV - > A - >(segue)B

    即使你隐藏导航栏,你仍然应该能够制作segues . 你也不能在viewWillAppear的第二个(B)视图控制器中取消隐藏导航栏吗?首先,以相同的方式将其隐藏在viewWillAppear上 .

    编辑:问题的最终解决方案:使用:

    let controller = storyboard.instantiateViewControllerWithIdentifier("HomeVC")
     self.navigationController!.pushViewController(controller)
    

    代替:

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

    因为pushViewController会将secondViewController添加到其堆栈中 . presentViewController正在取代你的导航控制器,这就是你看不到导航栏的原因 .

  • 2
    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)
    }
    
  • 0

    在视图控制器的viewDidLoad方法中,您不希望在其中显示导航栏添加该行

    navigationController.navigationBarHidden = true
    

    你现在隐藏在所有视图控制器中

    编辑:你正在呈现视图控制器,它应该是

    self.navigationController!.pushViewController(controller)
    
  • 1

    我在快速项目中有同样的要求 .

    this is how I have handled Navigation bar

    确保您的第一个屏幕嵌入到导航控制器中

    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中启用导航,您需要在屏幕A中添加以下代码

    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)
            }
    
        }
    

    使用上面的样式,我可以随时启用或禁用特定屏幕的导航栏

  • 11

    如果您需要仅在此控制器中隐藏此导航栏,最好的方法是在 viewWillDisappear() 中显示它并隐藏在 viewWillAppear() 中 .

  • 1

    喜欢 viewcontroller 基于隐藏使用 Swift 4.0

    viewWillAppear 中隐藏 navigationController

    override func viewWillAppear(animated: Bool) {
         super.viewWillAppear(animated)
        self.navigationController?.isNavigationBarHidden = true
    }
    

    viewWillDisappear 取消隐藏 navigationController

    override func viewWillDisappear(animated: Bool)
    {
        super.viewWillDisappear(animated)
        self.navigationController?.isNavigationBarHidden = false
    }
    
  • 3

    回复为时已晚,还有其他好的答案,但我想分享一下对我有用的东西 .

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

相关问题