在呈现视图控制器时设置后退按钮

时间:2017-10-09 09:01:21

标签: ios swift uinavigationbar

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

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

我做错了什么?请帮忙

6 个答案:

答案 0 :(得分:4)

代码存在多个问题。

问题1:

您应该更新viewController的bar按钮项而不是navigationController的bar按钮项。

所以这是错误的

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:

{{3}}

答案 1 :(得分:2)

仅对导航堆栈中的视图控制器显示“后退”按钮。

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

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

答案 2 :(得分:0)

演示会将您的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)

答案 3 :(得分:0)

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

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

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

答案 4 :(得分:0)

  

在水平常规环境中,视图控制器是   以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)

答案 5 :(得分:0)

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

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

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

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

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