iOS: 只隐藏一个 viewcontroller 的导航栏,它是 UINavigationController 的根目录?

iOS: Hide the navigation bar for only one viewcontroller which is root of the UINavigationController?

我只想隐藏一个 viewcontroller 的导航栏,它是 UINavigationController 的根 viewcontroller。

目前我正在使用下面的代码来隐藏特定 viewcontroller 的导航栏。

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

当我尝试使用此代码时,应用程序在 iOS 13 台设备中崩溃,原因是线程违规:预期是主线程。

请检查我使用上面的代码隐藏导航栏时遇到的问题,

iOS 13: threading violation: expected the main thread

请告诉我是否有任何其他方法可以仅隐藏一个导航栏 viewcontroller。

您可以在调用 viewWillApper 时使其透明(完全不可见),并在调用 view willDisappear 时使其恢复正常。这是辅助函数。


func makeNaBarTransparent() {
      navigationController?.navigationBar.setBackgroundImage(UIImage(), for: .default)
      navigationController?.navigationBar.shadowImage = UIImage()
      navigationController?.navigationBar.isTranslucent = true
  }


 func restoreNavigationBarToDefault() {
      navigationController?.navigationBar.setBackgroundImage(nil, for: .default)
      navigationController?.navigationBar.shadowImage = nil
  }

用法

 import UIKit
class ViewController: UIViewController {

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

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

}
import UIKit
 class ViewController: UIViewController {

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

}

我从我的一个朋友那里得到了 hide/show 导航栏的另一种方式。

  • 为 NavigationController 设置委托:
navigationController.delegate = self
  • Hide/Show 每个导航栏 ViewController 都在一个地方
func navigationController(_ navigationController: UINavigationController, willShow viewController: UIViewController, animated: Bool) {
    let hide = (viewController is YourVC)
    navigationController.setNavigationBarHidden(hide, animated: animated)
}