Amogh Shettigar
Amogh Shettigar

Reputation: 285

Setting back button when presenting a view controller

On clicking a button I display a view controller using the following code:

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)

But the back button does not appear on the locationVC

What am I doing wrong? Please help

Upvotes: 5

Views: 15178

Answers (6)

Shahriar Hossain
Shahriar Hossain

Reputation: 148

The presenting view controller is responsible for dismissing the view controller is presented. If you call this method on the presented view controller itself, UIKit asks the presenting view controller to handle the dismissal.

If you present several view controllers in succession, thus building a stack of presented view controllers, calling this method on a view controller lower in the stack dismisses its immediate child view controller and all view controllers above that child on the stack. When this happens, only the top-most view is dismissed in an animated fashion; any intermediate view controllers are simply removed from the stack. The top-most view is dismissed using its modal transition style, which may differ from the styles used by other view controllers lower in the stack.

If you want to retain a reference to the view controller's presented view controller, get the value in the presentedViewController property before calling this method.

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

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

Upvotes: 1

Damien
Damien

Reputation: 3361

presentViewController is a method that bring a modal view to your navigation, not part of the navigationController.

Instead you should use the pushToViewController method on the navigationController (and not creating a new one) like that :

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

Upvotes: 0

mihatel
mihatel

Reputation: 846

In a horizontally regular environment, the view controller is presented in the style specified by the modalPresentationStyle property. In a horizontally compact environment, the view controller is presented full screen by default. doc: presentViewController

So, if you use present a view controller it will not show in navigation controller thus no back button For this case you need to push view controller.

From storyboard:

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

Programmatically

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

Upvotes: 3

Sandeep Bhandari
Sandeep Bhandari

Reputation: 20379

Multiple issues with code.

Issue 1:

You should update viewController's bar button item and not navigationController's bar button item.

So this is wrong

navController.navigationItem.backBarButtonItem

Whats correct

self.navigationItem.backBarButtonItem

Issue 2:

The above code won't work because your current viewController is not pushed by any other VC so it cant show back button. What you need is leftBarButtonItem

So in your VC you can write

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

O/P:

enter image description here

Upvotes: 16

LOKESH KUMAR PEDDA
LOKESH KUMAR PEDDA

Reputation: 437

Back button only appears for view controllers in the navigation stack.

you creating new navigation controller stack and making locationVC as root controller so there won't be any view controller to go back.

If you push another view controller to the navigation stack then you will get back button.

Upvotes: 5

Mohamad Bachir Sidani
Mohamad Bachir Sidani

Reputation: 2099

presenting will present your VC on top of everything and not push it to the navigayionCOntroller.

You should push your VC to the NavigationController instead like so:

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)

Upvotes: 0

Related Questions