从 TableView 推送视图控制器后如何保持导航栏标题较大
How to keep navigation bar title large after pushing view controller from TableView
I have a tableview displaying on a main view controller, and when a row is selected a detail view controller is pushed.我有一个主视图控制器的大标题,以及详细视图控制器的 small/regular 标题。它们嵌入在导航控制器和标签栏控制器中。
Before selecting a row, the main view controller title is large, and when a row is selected the detail view controller title is regular as it should be.但是当我从详细视图控制器 return 到主视图控制器时(通过 "back" 按钮),主视图控制器上的标题不再大。
我在主视图控制器上将 "prefersLargeTitles" 设置为 true,在详细视图控制器上将 "largeTitleDisplayMode" 设置为从不。
我尝试将 "largeTitleDisplayMode" 设置为始终在主视图控制器上,但无济于事。我也试过在任一视图控制器上将其设置为自动,但似乎没有效果。
我也尝试过使用 "viewWillAppear" 和 "viewWillDisappear" 并在其中设置标题,虽然它确实将主视图控制器标题重置为大标题,但动画滞后并且不是从小标题过渡到大标题时不像往常那样流畅。
此外,我对编码还很陌生,这是我在不使用故事板的情况下构建的第一个应用程序,因此代码可能会一团糟。
主视图控制器代码:
class HomeViewController: UIViewController {
let tableView = UITableView()
override func loadView() {
super.loadView()
view.backgroundColor = .white
self.title = "Home"
// Set large title
navigationController?.navigationBar.prefersLargeTitles = true
// Make navigation bar transparent
navigationController?.navigationBar.setBackgroundImage(UIImage(), for: .default)
navigationController?.navigationBar.shadowImage = UIImage()
navigationController?.navigationBar.isTranslucent = true
}
extension HomeViewController: UITableViewDelegate {
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
let vc = DetailViewController() as DetailViewController
if indexPath.section == 0 {
vc.detailTitle = itemsTop[indexPath.row]
} else if indexPath.section == 1 {
vc.detailTitle = itemsBottom[indexPath.row]
} else {
print("Failed to load title")
}
navigationController?.pushViewController(vc, animated: true)
tableView.deselectRow(at: indexPath, animated: true)
}
}
详细视图控制器代码:
class DetailViewController: UIViewController {
var detailTitle: String?
override func viewDidLoad() {
super.viewDidLoad()
title = detailTitle
// Make nav bar transparent
navigationController?.navigationBar.setBackgroundImage(UIImage(), for: .default)
navigationController?.navigationBar.shadowImage = UIImage()
navigationController?.navigationBar.isTranslucent = true
// Prevent large title
navigationController?.navigationBar.prefersLargeTitles = false
}
}
您需要在主视图控制器的 viewWillAppear
中将 navigationController?.navigationBar.prefersLargeTitles
设置为 true,以便每次返回主视图控制器时都让它 运行 。
您可以在 viewWillAppear
的详细信息中将其设置为 false,并在 viewWillDisappear
的详细信息中将其还原,以防止它也保持为 false。
您的 DetailVC 的代码:
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
navigationController?.navigationBar.prefersLargeTitles = false
}
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
navigationController?.navigationBar.prefersLargeTitles = true
}
try this it's working.
In 'HomeViewController'
override func viewDidLoad() {
super.viewDidLoad()
navigationController?.navigationBar.prefersLargeTitles = true
}
In 'DetailViewController'
override func viewDidLoad() {
super.viewDidLoad()
self.navigationItem.largeTitleDisplayMode = .never
}
I have a tableview displaying on a main view controller, and when a row is selected a detail view controller is pushed.我有一个主视图控制器的大标题,以及详细视图控制器的 small/regular 标题。它们嵌入在导航控制器和标签栏控制器中。
Before selecting a row, the main view controller title is large, and when a row is selected the detail view controller title is regular as it should be.但是当我从详细视图控制器 return 到主视图控制器时(通过 "back" 按钮),主视图控制器上的标题不再大。
我在主视图控制器上将 "prefersLargeTitles" 设置为 true,在详细视图控制器上将 "largeTitleDisplayMode" 设置为从不。
我尝试将 "largeTitleDisplayMode" 设置为始终在主视图控制器上,但无济于事。我也试过在任一视图控制器上将其设置为自动,但似乎没有效果。
我也尝试过使用 "viewWillAppear" 和 "viewWillDisappear" 并在其中设置标题,虽然它确实将主视图控制器标题重置为大标题,但动画滞后并且不是从小标题过渡到大标题时不像往常那样流畅。
此外,我对编码还很陌生,这是我在不使用故事板的情况下构建的第一个应用程序,因此代码可能会一团糟。
主视图控制器代码:
class HomeViewController: UIViewController {
let tableView = UITableView()
override func loadView() {
super.loadView()
view.backgroundColor = .white
self.title = "Home"
// Set large title
navigationController?.navigationBar.prefersLargeTitles = true
// Make navigation bar transparent
navigationController?.navigationBar.setBackgroundImage(UIImage(), for: .default)
navigationController?.navigationBar.shadowImage = UIImage()
navigationController?.navigationBar.isTranslucent = true
}
extension HomeViewController: UITableViewDelegate {
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
let vc = DetailViewController() as DetailViewController
if indexPath.section == 0 {
vc.detailTitle = itemsTop[indexPath.row]
} else if indexPath.section == 1 {
vc.detailTitle = itemsBottom[indexPath.row]
} else {
print("Failed to load title")
}
navigationController?.pushViewController(vc, animated: true)
tableView.deselectRow(at: indexPath, animated: true)
}
}
详细视图控制器代码:
class DetailViewController: UIViewController {
var detailTitle: String?
override func viewDidLoad() {
super.viewDidLoad()
title = detailTitle
// Make nav bar transparent
navigationController?.navigationBar.setBackgroundImage(UIImage(), for: .default)
navigationController?.navigationBar.shadowImage = UIImage()
navigationController?.navigationBar.isTranslucent = true
// Prevent large title
navigationController?.navigationBar.prefersLargeTitles = false
}
}
您需要在主视图控制器的 viewWillAppear
中将 navigationController?.navigationBar.prefersLargeTitles
设置为 true,以便每次返回主视图控制器时都让它 运行 。
您可以在 viewWillAppear
的详细信息中将其设置为 false,并在 viewWillDisappear
的详细信息中将其还原,以防止它也保持为 false。
您的 DetailVC 的代码:
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
navigationController?.navigationBar.prefersLargeTitles = false
}
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
navigationController?.navigationBar.prefersLargeTitles = true
}
try this it's working. In 'HomeViewController'
override func viewDidLoad() {
super.viewDidLoad()
navigationController?.navigationBar.prefersLargeTitles = true
}
In 'DetailViewController'
override func viewDidLoad() {
super.viewDidLoad()
self.navigationItem.largeTitleDisplayMode = .never
}