【问题标题】:iOS: Hide the navigation bar for only one viewcontroller which is root of the UINavigationController?iOS:仅隐藏一个视图控制器的导航栏,它是 UINavigationController 的根?
【发布时间】:2019-10-11 07:34:35
【问题描述】:

我只想隐藏一个视图控制器的导航栏,它是 UINavigationController 的根视图控制器。

目前我正在使用下面的代码来隐藏特定视图控制器的导航栏。

  • 要隐藏导航栏,
    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

如果有任何其他方法可以仅为一个视图控制器隐藏导航栏,请告诉我。

【问题讨论】:

  • 你已经问过这个问题一次here。不要多次询问同一个问题。关闭此问题。

标签: ios swift multithreading uinavigationbar navigationbar


【解决方案1】:

我得到了另一种方法来隐藏/显示我的一个朋友的导航栏。

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

【讨论】:

    【解决方案2】:
    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
       }
    

    }

    【讨论】:

      【解决方案3】:

      您可以在调用 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()
          }
      
      }
      

      【讨论】:

        猜你喜欢
        • 2015-07-17
        • 1970-01-01
        • 1970-01-01
        • 2018-04-19
        • 1970-01-01
        • 2017-02-11
        • 2011-01-07
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多