导航控制器标题未显示?
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
时,你还在viewDidLoad
的viewDidLoad
中使用self.title = "Route Options"
吗?
@rmaddy 是的,我在viewDidLoad
的OptionsViewController
中设置了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 问题的人有用。
【讨论】:
以上是关于导航控制器标题未显示?的主要内容,如果未能解决你的问题,请参考以下文章