【问题标题】:Navigation bar not showing iOS swift导航栏不显示 iOS swift
【发布时间】:2018-07-09 15:45:33
【问题描述】:

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

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

现在我想在其他视图控制器中添加导航栏,但是我的导航栏在该视图控制器中不可见。为什么会这样?

我的故事板显示导航栏,但一旦我尝试运行我的应用程序,它就消失了。

如果我从一个视图控制器中隐藏导航栏,那么我们就不能使用导航控制器,是这样吗?我希望我错了。那么导航栏不显示是什么原因呢?

编辑:

我还希望我的视图控制器只处于纵向模式。所以我做了以下是导致问题的原因吗?

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:

这是我的导航控制器属性检查器

【问题讨论】:

  • 您在整个导航控制器堆栈上进行设置,因此它不会在放置在导航控制器上的视图控制器上可见。如果您只需要在某些视图控制器上禁用,只需执行 [self.navigationController setNavigationBarHidden:YES];在视图控制器的 viewDidLoad 方法中

标签: ios swift uinavigationcontroller


【解决方案1】:

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

NAV -> A -> (segue) B

即使您将隐藏导航栏,您仍然应该能够进行转场。您也不能在 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 正在替换您的导航控制器,这就是您看不到导航栏的原因。

【讨论】:

  • 那么有没有办法再次启用导航栏?
  • 为什么要启用?你不会一开始就禁用它。您只需像任何其他普通视图一样隐藏它。所以你总是可以取消隐藏它。
  • 我的另一个问题,即使我没有隐藏我的第一个导航栏,导航栏在第二个视图控制器中不可见。
  • 确保你没有第二个导航视图控制器,只有一个。
  • 是的,它不会那样工作。 navigationController.pushViewController 应该可以完成这项工作。
【解决方案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)
}

【讨论】:

  • 我试过这个不起作用。请检查我编辑的问题。
  • 请检查我的编辑 2:我错过了什么吗?
  • 感谢您的逻辑是完美的解决方案
  • 是的,我做错了,我把新的视图控制器称为 presentViewController(secondViewController,animated: false,completion: nil)。但是我需要使用这个navigationController!.pushViewController(controller, animated: false);。 @Makalele 找到错误。
  • @Amsheer -- 对不起,我想问这个问题,目前的视图控制器不显示/嵌入导航控制器,如果你想执行这个,你需要手动嵌入导航控制器。否则你需要把它转换成推送视图控制器
【解决方案3】:

在不想显示导航栏的视图控制器的 viewDidLoad 方法中添加一行

navigationController.navigationBarHidden = true

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

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

self.navigationController!.pushViewController(controller) 

【讨论】:

  • 您可以使用 Objc-Swift 转换器 (objectivec2swift.com/#/converter/code) 并发布,您的回答会更有帮助
  • 请检查我的编辑 2:我错过了什么吗?
  • 您的第二个视图控制器未分配给一个类查看您的屏幕截图,它没有显示任何分配的视图控制器类。而且您正在展示视图控制器。相反,您需要推送视图控制器 self.navigationController!.pushViewController(controller)
  • 顺便说一句,你确定你的第二个视图控制器是从 UIViewController 继承的?
  • 是的,一切都是 viewcontroller,但我的问题我称之为 presntviewcontroller。我需要像 pushviewcontroller 一样打电话..
【解决方案4】:

使用 Swift 4.0

在基于 viewcontroller 的隐藏中点赞

navigationController隐藏在viewWillAppear

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
}

【讨论】:

    【解决方案5】:

    我的 swift 项目有同样的要求。

    这就是我处理导航栏的方式

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

    例如我们有两个屏幕 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)
            }
    
        }
    

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

    【讨论】:

    • 什么是 kSEGUE_ID_MANAGE_ACCOUNT?
    • 这是下一个屏幕的 segue 标识符
    • 我认为我做错了什么。我用“StoryBoard Id”替换了这个“kSEGUE_ID_MANAGE_ACCOUNT”。还是没有运气。
    • aah 抱歉,实际上我使用常量作为 segue,像这样 let kSEGUE_ID_MANAGE_ACCOUNT = "loadManageAccountSegue"
    • 它仍然无法正常工作。你能检查我编辑的问题吗?
    【解决方案6】:

    如果你只需要在这个控制器中隐藏这个导航栏,最好的方法是在viewWillDisappear()中显示并在viewWillAppear()中隐藏。

    【讨论】:

    • 我试过这样不起作用。请检查我的编辑 2:我错过了什么吗?
    • 感谢您的逻辑是正确的,但我的代码出错了。
    【解决方案7】:

    现在回复太晚了,还有其他很好的答案,但我想分享对我有用的方法。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-09-12
      • 1970-01-01
      • 1970-01-01
      • 2018-05-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多