【问题标题】:Setting back button when presenting a view controller呈现视图控制器时设置后退按钮
【发布时间】:2017-10-09 09:01:20
【问题描述】:

单击按钮时,我使用以下代码显示视图控制器:

let navController = UINavigationController(rootViewController: locationVC)
navController.navigationBar.barTintColor = StyleHelper.navBarColor()
navController.navigationBar.tintColor = UIColor.whiteColor()               
navController.navigationItem.backBarButtonItem = UIBarButtonItem(image: UIImage(named: "back_arrow"), style: .Plain, target: locationVC, action: nil)
self.presentViewController(navController, animated: true, completion: nil)

但是locationVC上没有出现后退按钮

我做错了什么?请帮忙

【问题讨论】:

  • 你在下一个视图控制器中写了 self.navigationController.navigationBar.ishidden = false 吗?
  • @Amogh Shetigar 我猜你需要在堆栈上推一个控制器才能返回按钮。
  • 这是正常行为。 locationVC 是第一个也是唯一一个控制器,没有前一页,这就是为什么没有出现后退按钮的原因。如果每次呈现新页面时都创建一个新的导航控制器,那你就错了。试试pushViewController 而不是presentViewController

标签: ios swift uinavigationbar


【解决方案1】:

代码存在多个问题。

问题 1:

你应该更新 viewController 的 bar button item 而不是 navigationController 的 bar button item。

这是错误的

navController.navigationItem.backBarButtonItem

什么是正确的

self.navigationItem.backBarButtonItem

问题 2:

上面的代码不起作用,因为您当前的 viewController 没有被任何其他 VC 推送,所以它不能显示返回按钮。你需要的是leftBarButtonItem

所以在你的 VC 中你可以写

override func viewDidLoad() {
    super.viewDidLoad()
    self.navigationItem.leftBarButtonItem = UIBarButtonItem(title: "Abcd", style: .done, target: self, action: yourSelectorHere)
}

O/P:

【讨论】:

  • 好的,感谢您提供详细信息,这实际上是问题所在。
  • @amogh-shettigar : 永远欢迎朋友 :) 很高兴我能帮上忙 :) 编码愉快 :)
【解决方案2】:

后退按钮仅出现在导航堆栈中的视图控制器上。

您创建了新的导航控制器堆栈并将 locationVC 作为根控制器,因此不会有任何视图控制器可以返回。

如果您将另一个视图控制器推送到导航堆栈,那么您将获得返回按钮。

【讨论】:

    【解决方案3】:

    在水平规则的环境中,视图控制器是 以 modalPresentationStyle 指定的样式呈现 财产。在水平紧凑的环境中,视图控制器 默认全屏显示。 doc: presentViewController

    因此,如果您使用呈现视图控制器,它将不会显示在导航控制器中,因此没有返回按钮 对于这种情况,您需要推送视图控制器。

    来自故事板:

    let storyBoard: UIStoryboard = UIStoryboard(name: "Main", bundle: nil)
    let vc = storyBoard.instantiateViewController(withIdentifier: 
        "newViewController") as! YourViewController
        self.navigationController?.pushViewController(vc, animated: true)
    

    以编程方式

    let vc = YourViewController()
    self.navigationController?.pushViewController(vc, animated: true)
    

    【讨论】:

      【解决方案4】:

      presenting 会将您的 VC 展示在所有内容之上,而不是将其推送到 navigayionCONtroller。

      你应该像这样将你的 VC 推送到 NavigationController:

      var rootViewController = self.window!.rootViewController as UINavigationController
          let mainStoryboard: UIStoryboard = UIStoryboard(name: "Main", bundle: nil)
          var profileViewController = mainStoryboard.instantiateViewControllerWithIdentifier("profile") as ProfileViewController
          rootViewController.pushToViewController(profileViewController, animated: true)
      

      【讨论】:

        【解决方案5】:

        presentViewController 是一种为您的导航带来模态视图的方法,而不是navigationController 的一部分。

        相反,您应该像这样在navigationController 上使用pushToViewController 方法(而不是创建一个新方法):

        if let navigationController = self.navigationController {
            navigationController.pushViewController(locationVC, animated: true)
        }
        

        【讨论】:

          【解决方案6】:

          呈现视图控制器负责关闭呈现的视图控制器。如果您在呈现的视图控制器本身上调用此方法,UIKit 会要求呈现的视图控制器处理解除。

          如果您连续呈现多个视图控制器,从而构建一个呈现视图控制器的堆栈,则在堆栈中较低的视图控制器上调用此方法会关闭其直接子视图控制器以及堆栈上该子视图控制器上方的所有视图控制器。发生这种情况时,只有最顶层的视图会以动画方式消失;任何中间视图控制器都简单地从堆栈中删除。最顶层的视图使用其模态转换样式被解除,这可能与堆栈中其他视图控制器使用的样式不同。

          如果您想保留对视图控制器呈现的视图控制器的引用,请在调用此方法之前获取presentedViewController 属性中的值。

          @IBAction func backButtonAction(_ sender: UIButton) {
                  self.dismiss(animated: true)
              }
          

          更多: https://developer.apple.com/documentation/uikit/uiviewcontroller/1621505-dismiss

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2012-12-03
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2010-11-30
            相关资源
            最近更新 更多