【问题标题】:Show back button without navigation view controller显示没有导航视图控制器的后退按钮
【发布时间】:2018-06-22 22:01:41
【问题描述】:

我有方案:UITabBarViewController(带有 3 个标签)。
在所有这些选项卡中,我不想在顶部显示导航菜单。 从第一个选项卡中,我想通过按钮单击推送另一个视图控制器,该控制器将具有“返回”按钮(以及带有“取消”的顶部工具栏)

我尝试了一些方法 - 在 storyboard 中使用 push segue - 没有后退按钮。 可能是因为我没有导航视图控制器,所以我的导航堆栈是空的。

以编程方式:

let storyBoard : UIStoryboard = UIStoryboard(name: "Main", bundle:nil)

let nextViewController = storyBoard.instantiateViewController(withIdentifier: "AddCoinTableViewController") as! AddCoinTableViewController
self.present(nextViewController, animated:true, completion:nil)

如果我在导航控制器中嵌入标签,那么我有顶部工具栏(我不想要)。

有什么制作方法吗?

【问题讨论】:

    标签: ios swift


    【解决方案1】:

    如果不使用UINavigationController,您将无法实现导航功能。我的意思是你必须自己做所有动画类型的东西,我认为这不是一个好主意。而不是这样,您可以使用UINavigationController,如果您不想在某些视图控制器上显示navigationBar,请对这些视图控制器执行以下操作。

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

    【讨论】:

    • 谢谢,它有效。对代码的小改动:我在 viewWillAppear 中添加了,因为返回时未调用 viewDidLoad()。
    • You can't achieve navigationBar functionality without using UINavigationController 不正确.. 您可以使用 UINavigatonBar 作为控制器中的子视图,如果您愿意,可以向其中添加返回按钮.. 或者只是创建自己的后退按钮作为子视图-查看..
    • @Brandon 你是对的,但是当且仅当你的父视图控制器有 UINavigationController 时才会显示 UINavigationBar。
    • @Brandon 即使我说“我的意思是你必须自己做所有动画类型的东西,我认为这不是一个好主意”
    • 即使我们没有使用 UINavigationController,self.present(nextViewController, animated:true, completion:nil) 也会呈现视图控制器而不是推送到堆栈。
    【解决方案2】:

    您可以将导航控制器嵌入到您的第一个选项卡控制器(或任何您想要的)中,并将其隐藏在您不想要的控制器中 viewDidLoad 中,如下所示:

    self.navigationController?.isNavigationBarHidden = true

    这样做,您将能够在您按下的控制器上看到返回按钮,并且没有隐藏导航栏。

    确保使用导航控制器推送控制器,如下所示:

    self.navigationController?.pushViewController(YOUR VIEW CONTROLLER, animated: true)

    【讨论】:

      【解决方案3】:

      下面的代码将允许您创建自己的导航处理类,并拥有UINavigationController 具有的“推送”“弹出”动画。您可以创建一个新项目,将下面的内容复制粘贴到ViewController.swift 并查看为自己..

      现在你可以赋予任何UIViewController 导航控制器能力..

      import UIKit
      
      class NavigationHandler : NSObject, UIViewControllerTransitioningDelegate, UIViewControllerAnimatedTransitioning, UINavigationBarDelegate {
          private var isPresenting: Bool = false
          private weak var controller: UIViewController?
      
          init(controller: UIViewController) {
              super.init()
      
              self.controller = controller
              controller.transitioningDelegate = self
      
              let navigationBar = UINavigationBar()
              controller.view.addSubview(navigationBar)
              NSLayoutConstraint.activate([
                  navigationBar.leftAnchor.constraint(equalTo: controller.view.leftAnchor),
                  navigationBar.rightAnchor.constraint(equalTo: controller.view.rightAnchor),
                  navigationBar.topAnchor.constraint(equalTo: controller.view.safeAreaLayoutGuide.topAnchor)
              ])
              navigationBar.translatesAutoresizingMaskIntoConstraints = false
              navigationBar.delegate = self
      
              let item = UINavigationItem(title: controller.title ?? "")
              let barButton = UIBarButtonItem(title: "Back", style: .done, target: self, action: #selector(onBackButton(button:)))
      
              item.leftBarButtonItems = [barButton]
              navigationBar.setItems([item], animated: true)
          }
      
          func position(for bar: UIBarPositioning) -> UIBarPosition {
              return .topAttached
          }
      
          @objc
          private func onBackButton(button: UIBarButtonItem) {
              self.controller?.dismiss(animated: true, completion: nil)
          }
      
          func animationController(forPresented presented: UIViewController, presenting: UIViewController, source: UIViewController) -> UIViewControllerAnimatedTransitioning? {
              self.isPresenting = true;
              return self;
          }
      
          func animationController(forDismissed dismissed: UIViewController) -> UIViewControllerAnimatedTransitioning? {
              self.isPresenting = false;
              return self;
          }
      
          func transitionDuration(using transitionContext: UIViewControllerContextTransitioning?) -> TimeInterval {
              return 0.25;
          }
      
          func animateTransition(using transitionContext: UIViewControllerContextTransitioning) {
              let duration = self.transitionDuration(using: transitionContext)
              let fromController = transitionContext.viewController(forKey: .from)
              let toController = transitionContext.viewController(forKey: .to)
              let containerView = transitionContext.containerView
      
              if self.isPresenting {
                  let frame = fromController!.view.frame
                  containerView.addSubview(toController!.view)
                  toController?.view.frame = CGRect(x: frame.origin.x + frame.width, y: frame.origin.y, width: frame.width, height: frame.height)
      
                  UIView.animate(withDuration: duration, animations: {
      
                      fromController?.view.frame = CGRect(x: frame.origin.x - frame.size.width, y: frame.origin.y, width: frame.size.width, height: frame.size.height)
      
                      toController?.view.frame = frame
      
                  }, completion: { (completed) in
                      transitionContext.completeTransition(true)
                  })
              }
              else {
                  let frame = fromController!.view.frame
                  containerView.insertSubview(toController!.view, at: 0)
                  toController?.view.frame = CGRect(x: frame.origin.x - frame.size.width, y: frame.origin.y, width: frame.size.width, height: frame.size.height)
      
                  UIView.animate(withDuration: duration, animations: {
      
                      fromController?.view.frame = CGRect(x: frame.origin.x + frame.width, y: frame.origin.y, width: frame.width, height: frame.height)
      
                      toController?.view.frame = frame
      
                  }, completion: { (completed) in
                      transitionContext.completeTransition(true)
                  })
              }
          }
      }
      

      查看控制器进行测试:

      class ViewController : UIViewController {
      
          private var navigationHandler: NavigationHandler?
      
          override func viewDidLoad() {
              super.viewDidLoad()
      
              let button = UIButton(type: .custom)
              button.setTitle("Push Controller", for: .normal)
              button.setTitleColor(UIColor.red, for: .normal)
              button.layer.borderColor = UIColor.black.cgColor
              button.layer.borderWidth = 1.0
              button.layer.cornerRadius = 5.0
              button.translatesAutoresizingMaskIntoConstraints = false
              self.view.addSubview(button)
              NSLayoutConstraint.activate([
                  button.centerXAnchor.constraint(equalTo: self.view.centerXAnchor),
                  button.centerYAnchor.constraint(equalTo: self.view.centerYAnchor),
                  button.heightAnchor.constraint(equalToConstant: 45.0),
                  button.widthAnchor.constraint(equalToConstant: 150.0)
              ])
      
              button.addTarget(self, action: #selector(onPush(button:)), for: .touchUpInside)
          }
      
          @objc
          private func onPush(button: UIButton) {
              let child = ChildViewController()
              self.navigationHandler = NavigationHandler(controller: child)
              self.present(child, animated: true, completion: nil)
          }
      }
      
      class ChildViewController: UIViewController {
      
          override func viewDidLoad() {
              super.viewDidLoad()
      
              self.view.backgroundColor = UIColor.blue
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-03-26
        • 1970-01-01
        • 1970-01-01
        • 2014-02-16
        • 1970-01-01
        • 2012-01-01
        相关资源
        最近更新 更多