如何在Swift中从第一个视图控制器隐藏导航栏?

329
如何在Swift中从第一个ViewController或特定的 ViewController 隐藏导航栏?
我在 viewDidLoad() 中使用了以下代码:
override func viewDidLoad() {
    super.viewDidLoad()
    self.navigationController?.isNavigationBarHidden = true
}

还有在viewWillAppear中:

override func viewWillAppear(animated: Bool) {
    self.navigationController?.isNavigationBarHidden = true
}

这两种方法都会将导航控制器从所有的视图控制器中隐藏。


1
你需要为所有的视图控制器手动管理它,无法仅针对其中任何一个进行操作。 - itsji10dra
14个回答

517

如果您知道所有其他视图都应该显示该栏,请使用 viewWillDisappear 将其再次设置为可见。

在 Swift 中:

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    navigationController?.setNavigationBarHidden(true, animated: animated)
}

override func viewWillDisappear(_ animated: Bool) {
    super.viewWillDisappear(animated)
    navigationController?.setNavigationBarHidden(false, animated: animated)
}

3
这个答案更高效。考虑到每次添加新的ViewController时所涉及到的重复代码。https://dev59.com/Pl4b5IYBdhLWcg3wZwu3#39679506 - Amr Eladawy

268

Swift 3

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)
}

3
使用覆盖方法时,不要忘记调用父类的方法:super.viewWillAppear(animated) 和 super.viewWillDisappear(animated)。 - NielsKoole
它会移除“返回”链接吗? - Cons Bulaquena
1
我曾经认为在视觉层面上“滑动返回”可能无法很好地工作,但一切正常。谢谢! - zalogatomek
附注:不需要使用 self. - Tomasz Pe
在从带有导航栏的视图向带有隐藏导航栏的视图滑动返回时,我们如何重新实现导航栏的淡出效果? - T.Okahara
当我从底部以模态方式呈现它时,动画会显示带有动画的导航栏,看起来很糟糕... - Radek Wilczak

80

你可以在 viewWillDisappear 中取消隐藏 navigationController

override func viewWillDisappear(animated: Bool)
{
    super.viewWillDisappear(animated)
    self.navigationController?.isNavigationBarHidden = false
}

Swift 3

override func viewWillDisappear(_ animated: Bool) {
    super.viewWillDisappear(animated)

    self.navigationController?.setNavigationBarHidden(false, animated: animated)
}

27

您还可以创建一个扩展,这样您就可以重复使用该扩展,而不需要在每个视图控制器中再次实现此功能。

import UIKit

extension UIViewController {
    func hideNavigationBar(animated: Bool){
        // Hide the navigation bar on the this view controller
        self.navigationController?.setNavigationBarHidden(true, animated: animated)

    }

    func showNavigationBar(animated: Bool) {
        // Show the navigation bar on other view controllers
        self.navigationController?.setNavigationBarHidden(false, animated: animated)
    }

}

那么你可以按照以下方式使用扩展方法

    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        hideNavigationBar(animated: animated)
    }

    override func viewWillDisappear(_ animated: Bool) {
        super.viewWillDisappear(animated)
        showNavigationBar(animated: animated)
    }

24
延期也不是很值得,对吧? :) - Joris Weimar
3
根据你隐藏/显示导航栏的观点数量而定。我觉得大多数情况下你只会隐藏第一个,但如果你经常这样做,使用该扩展程序会很方便。 - jnwagstaff
肯定不值得。不要发明已经存在的东西。 - Thafer Shahin

8
在Swift 3中,您可以使用isNavigationBarHidden属性来显示或隐藏导航栏。
override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    // Hide the navigation bar for current view controller
    self.navigationController?.isNavigationBarHidden = true;
}

override func viewWillDisappear(_ animated: Bool) {
    super.viewWillDisappear(animated)
    // Show the navigation bar on other view controllers
   self.navigationController?.isNavigationBarHidden = false;
}

6

在Swift中隐藏导航栏的方法:

self.navigationController?.setNavigationBarHidden(true, animated: true)
self.navigationController?.navigationBar.isHidden = true
self.navigationController?.isNavigationBarHidden = true

1
self.navigationController?.setNavigationBarHidden(true, animated: true) 对我起作用了。 - Nate Uni

5

想在第一个视图控制器上隐藏NavigationBar

override func viewWillAppear(animated: Bool) {
   self.navigationController?.isNavigationBarHidden = true
}

如何在第二个视图控制器上显示导航栏

override func viewWillAppear(animated: Bool) {
   self.navigationController?.isNavigationBarHidden = false
}

1
最好的最简单的解决方案! - Talha Safdar

3

在Swift中显示导航栏的方法:

self.navigationController?.setNavigationBarHidden(false, animated: true)
self.navigationController?.navigationBar.isHidden = false
self.navigationController?.isNavigationBarHidden = false

3
     private func setupView() {
            view.backgroundColor = .white
            navigationController?.setNavigationBarHidden(true, animated: false)
        }

可选方案

在viewDidLoad方法中使用以下设置

title = "Madman"
navigationController?.isNavigationBarHidden = false
navigationController?.navigationBar.prefersLargeTitles = true
navigationItem.largeTitleDisplayMode = .always

检查Collectionview、scrollview或tableView的限制条件

 NSLayoutConstraint.activate([
            tableView.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor),
            tableView.bottomAnchor.constraint(equalTo: view.bottomAnchor),
            tableView.leadingAnchor.constraint(equalTo: view.leadingAnchor),
            tableView.trailingAnchor.constraint(equalTo: view.trailingAnchor)
        ])

1
    /*.  Swift 5  */     
    let controller =  self.storyboard?.instantiateViewController(withIdentifier: "sc_userNavigation") as! UserNavigationViewController
    let navigationController = UINavigationController(rootViewController: controller)
    navigationController.setNavigationBarHidden(true, animated: false)
    navigationController.modalPresentationStyle = .fullScreen
    self.present(navigationController, animated: false, completion: nil)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接