导航控制器标题未显示?

Posted

技术标签:

【中文标题】导航控制器标题未显示?【英文标题】:Navigation controller title not showing up? 【发布时间】:2017-04-25 02:15:50 【问题描述】:

所以当我在AppDelegate didFinishLaunchingWithOptions 中有OptionsViewController 作为rootViewController 时...

let rootVC = OptionsViewController()
        let navigationController = UINavigationController(rootViewController: rootVC)
        navigationController.navigationBar.barTintColor = .white
        navigationController.navigationBar.isTranslucent = false
        navigationController.navigationBar.tintColor = .black
        self.window = UIWindow(frame: UIScreen.main.bounds)
        self.window!.rootViewController = navigationController
        self.window?.makeKeyAndVisible()

...如果我在 viewDidLoad() 中执行此操作,则设置 OptionViewController 的标题有效:

    title = "Route Options"

但是当我将OptionsViewController 推送到导航堆栈时,标题没有显示出来。

即如果我以与AppDelegate 中的rootViewController 不同的视图开始:

 let rootVC = HomeViewController()
    let navigationController = UINavigationController(rootViewController: rootVC)
    navigationController.navigationBar.barTintColor = .white
    navigationController.navigationBar.isTranslucent = false
    navigationController.navigationBar.tintColor = .black
    self.window = UIWindow(frame: UIScreen.main.bounds)
    self.window!.rootViewController = navigationController
    self.window?.makeKeyAndVisible()

HomeViewController 中,我像这样推送我的OptionViewController

    let optionsVC = OptionsViewController()
    navigationController?.pushViewController(optionsVC, animated: true)

标题不显示!

我设法让标题显示的唯一方法是(在OptionViewController

navigationController?.navigationBar.topItem?.title = "Route Options"

但它显示为后退按钮而不是在中间,这不是我想要的。

如果有人能告诉我如何设置标题,使其在被推入 navigationController 堆栈时位于导航栏的中间,那就太好了!

代码

AppDelegate.swift

class AppDelegate: UIResponder, UIApplicationDelegate 
     func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool 
        let rootVC = HomeViewController()
        let navigationController = UINavigationController(rootViewController: rootVC)
        let barAppearance = UINavigationBar.appearance()
        barAppearance.barTintColor = UIColor.blue
        barAppearance.tintColor = UIColor.white
        barAppearance.titleTextAttributes = [NSForegroundColorAttributeName: UIColor.white]
        self.window = UIWindow(frame: UIScreen.main.bounds)
        self.window!.rootViewController = navigationController
        self.window?.makeKeyAndVisible()

        return true
    

HomeViewController.swift

class HomeViewController: UIViewController, UITableViewDelegate, UITableViewDataSource, DestinationDelegate 
    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) 
            let optionsVC = OptionsViewController()
            self.definesPresentationContext = false //else going to try and present optionVC on homeVC when in optionVC
            navigationController?.pushViewController(optionsVC, animated: true)
        
        tableView.deselectRow(at: indexPath, animated: true)
    

OptionsViewController.swift

class OptionsViewController: UIViewController, UITableViewDelegate, UITableViewDataSource,
    DestinationDelegate, SearchBarCancelDelegate,UISearchBarDelegate,
    CLLocationManagerDelegate 
    override func viewDidLoad() 
        self.title = "Route Options"
    

【问题讨论】:

当你从HomeViewController推送OptionsViewController时,你还在viewDidLoadviewDidLoad中使用self.title = "Route Options"吗? @rmaddy 是的,我在viewDidLoadOptionsViewController 中设置了title 作为测试,注释掉与导航栏颜色混淆的行。 是的,当我从 HomeVC 转换到 OptionsVC 时,它仍然不起作用,但是当我从 OptionsVC 转换到 RouteDetailVC 并返回到 HomeVC 到 @ 时,它确实出现了987654359@ 【参考方案1】:

您需要将 navigationItem.title 设置为所需的值。如果你想要一张图片,你可以设置 navigationItem.titleView

override func viewDidLoad() 
    super.viewDidLoad()
    self.navigationItem.title = "Your title here"
  

【讨论】:

设置在视图控制器上,而不是导航控制器上 这就是我所做的class OptionsViewController:UIViewController override func viewDidLoad() self.navigationItem.title = "Your title here" 仅供参考 - self.title = "Some Title"self.navigationItem.title = "Some Title" 一样有效【参考方案2】:

对于其他根据标题来到这里的人,不要忘记将您在 IB 中的 ViewController 类设置为适当的 Swift 文件。

这样做之后,我可以毫无问题地设置标题

self.navigationItem.title = "my title"

self.title = "my title"

【讨论】:

【参考方案3】:

首先你需要设置UINavigationBar颜色和文字颜色。 在didFinishLaunchingWithOptions 试试这个。

let barAppearance = UINavigationBar.appearance()
    barAppearance.barTintColor = UIColor.blue
    barAppearance.tintColor = UIColor.white
    barAppearance.titleTextAttributes = [NSForegroundColorAttributeName: UIColor.white]

如果你想删除后退按钮后的字符串 也添加这些

let barItemAppearace = UIBarButtonItem.appearance()
    barItemAppearace.setBackButtonTitlePositionAdjustment(UIOffsetMake(0, -60), for:UIBarMetrics.default)

只需将您的标题设置为viewDidLoad()

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

    self.title = "Your Title"


【讨论】:

还是不行。当我从 HomeViewController 转换到 OptionsViewController 时,标题仍然是空白的。但是,当我从 OptionsViewController 转换到 RouteDetailViewController(它被推送到 NavigationController)然后转换回来时,标题就会显示出来。 我已经在超过 4 个应用程序中使用它。确认您的 UIViewController 已嵌入到 uinavigation 控制器中 我已经添加了我现在拥有的。出于某种原因,您的代码使我的OptionsVC 显示在导航栏下方。导航栏标题也不会显示,直到我从 OptionVC 转换到 RouteVC 回到 HomeVC 再到 OptionVC,所以这是同样的故障。【参考方案4】:

试试看:

HomeViewController:

let optionsVC = OptionsViewController()
navigationController?.viewControllers = [optionsVC]

在你的OptionsViewController:

override func viewDidLoad() 
        super.viewDidLoad()

        navigationController?.navigationBar.isTranslucent = false
        navigationItem.title = "Your Title"
    

【讨论】:

那也行不通。当我从HomeViewController 转换到OptionsViewController 时,标题仍然是空白的,它现在甚至没有显示后退按钮。但是,当我从OptionsViewController 转换到RouteDetailViewController(它被推到NavigationController)然后转换回来时,标题就会出现。这很奇怪【参考方案5】:

只需添加以下行来设置导航项的标题

self.title = "Title 1"

【讨论】:

如果需要设置导航项的标题。您需要明确告诉导航项。【参考方案6】:

使用 Objective-C 我也遇到了问题,它没有显示标题,而是转到下一个场景,标题出现在后退按钮旁边。

我真的不知道为什么,但我通过在 Swift 而不是 Objective-C 中编程该场景的相对 ViewController 解决了这个问题。

之后,使用命令就足够了:

self.title = "My Title"

因此我能够使用 if 语句或其他方法以编程方式编写我想要的内容。

也许这对遇到 Objective-C 问题的人有用。

【讨论】:

以上是关于导航控制器标题未显示?的主要内容,如果未能解决你的问题,请参考以下文章

导航控制器标题未显示

导航和标签栏控制器未显示

导航控制器未显示在 TableView 中

调用控制器和方法时,导航栏图像未显示在 MVC 视图上

模态视图导航栏未正确显示

标签栏 UIViewController 中导航栏中的按钮未显示