导航栏没有显示iOS swift
我的应用程序中有多个视图控制器。 我想在我的第一个视图控制器中隐藏navigationbar
栏。 所以我使用以下代码隐藏导航栏
navigationController?.setNavigationBarHidden(navigationController?.navigationBarHidden == false, animated: true);
现在我想在其他一些viewController中添加导航栏,但是我的导航栏在该viewcontroller中不可见。 为什么会这样?
我的故事板显示导航栏但是一旦我尝试运行我的应用程序它就消失了。
如果我从一个视图控制器隐藏导航栏然后我们不能使用导航控制器,是这样吗? 我希望我错了。 那么导航栏没有显示的原因是什么?
编辑:
另外,我只希望我的视图控制器处于纵向模式。 所以我做了以下是导致问题的原因吗?
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:
请查看我的以下屏幕截图。 这是我对secondview控制器的设置
编辑3:
这是我的导航控制器属性检查器
导航控制器是一个控制器,它有一堆视图控制器。 所以,如果你有这样的事情:
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正在取代你的导航控制器,这就是你看不到导航栏的原因。
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
你现在隐藏在所有视图控制器中
编辑:您正在呈现视图控制器,而不应该
self.navigationController!.pushViewController(controller)
我在快速项目中有同样的要求。
这就是我处理导航栏的方式
确保您的第一个屏幕嵌入到导航控制器中
例如,我们有两个屏幕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) } }
使用上面的样式,我可以随时启用或禁用特定屏幕的导航栏
如果您需要仅在此控制器中隐藏此导航栏,最好的方法是在viewWillDisappear()
显示它并隐藏在viewWillAppear()
。
回复为时已晚,还有其他好的答案,但我想分享一下对我有用的东西。
let controller = self.storyboard?.instantiateViewControllerWithIdentifier("HomeVC") self.navigationController!.pushViewController(controller!, animated:true)
喜欢在使用Swift 4.0隐藏的viewcontroller
在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 }