【问题标题】:Navigation Bar Not Showing after Adding NavigationController添加 NavigationController 后导航栏不显示
【发布时间】:2021-03-20 03:50:10
【问题描述】:

我有一个现有的UITableViewController,已嵌入到NavigationController 中。但是,当我呈现视图时,导航栏没有显示。

呈现TableViewController(它的故事板ID是:SelectServicesController):

if let selectServicesController = self.storyboard?.instantiateViewControllerWithIdentifier("SelectServicesController") as? UITableViewController {
    self.navigationController?.presentViewController(selectServicesController, animated: true, completion: nil)
}

这是我构建时的样子(导航栏不显示):

【问题讨论】:

  • 你的项目中还有其他导航控制器吗?
  • @DanielLeonard 是的,我愿意。这是一个单独的导航控制器。
  • 是的,但它可以影响它,因为它是一个父导航控制器。您的表视图是否对其超级视图顶部有限制。
  • @DanielLeonard 那么我应该使用相同的父导航控制器吗?问题是我想以模态方式呈现这个 tableview 控制器。不,我没有设置约束,因为它是一个 tableview 控制器,我不能为 tableview 设置约束。
  • 是的,您的文字出现在视图的运营商信息之上似乎很奇怪。

标签: ios swift


【解决方案1】:

所以我只是这样做了,一开始根本无法让它出现。然后想通了,你只需要选择导航控制器并将其设置为✅is initial View Controller

这就是你的故事板应该是什么样子

然后,为了显示所有内容,我将其添加到导航控制器呈现的视图的 viewDidLoad 中。这一步是可选的。

    self.navigationController?.navigationBar.barTintColor = UIColor.redColor()
    self.navigationController?.navigationBar.tintColor = UIColor.blackColor()
    self.navigationController?.navigationBar.titleTextAttributes = [NSForegroundColorAttributeName:UIColor.blackColor()]
    navigationController?.navigationBar.hidden = false

这就是它的样子

mmmm 红底黑字? 希望对你有帮助。

【讨论】:

  • 我试过这个,但我得到一个错误,navigationController 返回 nil。
  • 是的,所以我的答案将不起作用,因为它完全是任务,因为根本没有导航控制器。
【解决方案2】:

您正在呈现一个 UITableViewController,它没有导航控制器作为父级(即使您的 Storyboard 首先有它,但您实际上并没有使用它)。

您可以通过执行以下操作来解决此问题:

if let selectServicesController = self.storyboard?.instantiateViewControllerWithIdentifier("SelectServicesController") as? UITableViewController {
    let navigationController = UINavigationController(rootViewController: selectServicesController)
    self.navigationController?.presentViewController(navigationController, animated: true, completion: nil)
}

或者通过将导航控制器设置为情节提要的初始视图控制器,然后像这样调用它:

if let selectServicesController = self.storyboard?.instantiateInitialViewController() {
    self.navigationController?.presentViewController(selectServicesController, animated: true, completion: nil)
}

【讨论】:

    【解决方案3】:

    我遇到了同样的问题。我通过将 segue 更改为嵌入我要显示的视图控制器的导航控制器来解决它。

    希望它对你有用。 让我知道这是否是一种不好的做法。

    【讨论】:

      【解决方案4】:
      let storyboard = UIStoryboard(name: "Expense", bundle: Bundle(for: PTCAddExpenseViewController.self))
      
      
      let controller =  storyboard.instantiateViewController(withIdentifier:"AddExpense") as! PTCAddExpenseViewController
      
      
      
      let navigationController = UINavigationController(rootViewController: controller)
      
      self.present(navigationController, animated: true, completion: nil)
      

      【讨论】:

        【解决方案5】:

        添加这个对我有用:

        self.navigationController?.isNavigationBarHidden = false
        

        【讨论】:

          【解决方案6】:

          您是直接呈现表格视图控制器,而不是其导航控制器。如果您将导航控制器标记为初始视图控制器(在属性检查器中勾选“是初始视图控制器”框),那么您可以通过以下方式实例化并显示它:

          if let selectServicesNavController = self.storyboard?.instantiateInitialViewController() as? UINavigationController {
              // if you're pushing it onto an existing nav controller
              self.navigationController?.presentViewController(selectServicesNavController, animated: true, completion: nil)
          
              // if not (and this is probably the case), set the nav controller as your window's rootViewController
              UIApplication.sharedApplication().keyWindow.rootViewController = selectServicesNavController
          }
          

          【讨论】:

          • 问题是,我还有一个导航控制器。
          【解决方案7】:

          我的猜测是 Xcode 在向您的表格视图控制器提供以下代码时忽略了您的表格视图控制器嵌入在导航控制器中的事实:

          if let selectServicesController = self.storyboard?.instantiateViewControllerWithIdentifier("SelectServicesController") as? UITableViewController {
              self.navigationController?.presentViewController(selectServicesController, animated: true, completion: nil)
          }
          

          相反,我建议您修改 Simulated Metrics 下的 Top Bar 设置以满足您的需要,或者改为实例化您的导航控制器(首选和推荐后者)

          【讨论】:

          • 我尝试添加不透明的顶栏,但它仍然没有显示任何内容。
          【解决方案8】:

          在你的代码中,改变这一行

          self.navigationController?.presentViewController(selectServicesController, animated: true, completion: nil)
          

          到这里

          self.presentViewController(selectServicesController, animated: true, completion: nil)
          

          【讨论】:

          • 我尝试在导航栏中添加故事板 ID 并改为显示导航控制器。但是视图完全忽略了调用,不显示导航控制器也不显示tableviewcontroller。
          • 您需要从视图控制器本身呈现导航控制器,而不是导航控制器。
          【解决方案9】:

          我在您的一个 cmet 中读到您希望以模态方式呈现表格视图控制器,并显示导航栏。我们可以使用 Storyboard 来做到这一点。从应该以模态方式显示此表视图控制器的视图控制器,Ctrl+Drag 从视图控制器到表视图控制器的导航控制器。然后,选择模态展示。为 segue 设置一个标识符。然后,在以模态方式呈现表视图控制器的视图控制器的代码中,调用:

          self.performSegueWithIdentifier("YourSegueIdentifier", sender: nil)
          

          另一种无需使用任何代码即可完成此操作的方法是,如果模态演示是由按钮之类的东西触发的。然后,您可以从该按钮 Ctrl+Drag 到 Navigation Controller 并选择 Present Modally。

          【讨论】:

            【解决方案10】:

            或者可能是这个!!

            我遇到了同样的问题:导航栏显示在 Storyboard 的根视图上,但是在运行模拟器时 - 视图顶部没有导航栏。这解决了它:

            导航控制器>导航栏>取消选中半透明(默认选中)。这做了两件事:

            1. 我的导航栏显示在所有后续视图中。
            2. 最顶部的子视图现在位于 Y=0,而不是 Y=64。

            【讨论】:

              猜你喜欢
              • 2017-07-11
              • 2017-09-28
              • 1970-01-01
              • 1970-01-01
              • 2023-03-19
              相关资源
              最近更新 更多