24
votes

I have a Navigation Controller with a View Controller displaying a button. The button is linked to another View Controller using a push segue which automatically adds a top navigation bar with a back button. This all works fine. Pressing the back button slides off the 2nd view and returns to the 1st.

I have a button on the 2nd View Controller, that when pressed runs some code and a delegate call back to the 1st View Controller. Again this works fine.

Now I just need to dismiss the 2nd pushed View from code as if the back button was pressed. I have tried using dismissModalViewCcontrollerAnimated and dismissViewControllerAnimated, however they both dismiss the whole Navigation Controller which removes view 2 and 1 (returning bak to my main menu).

Whats the correct way to slide off the view.

6
Can you post the code you used to test? - sch

6 Answers

38
votes

Obtain a reference to your UINavigationController and call

- (UIViewController *)popViewControllerAnimated:(BOOL)animated

on it.

12
votes

In Swift it would be calling the method

navigationController?.popViewController(animated: true)
3
votes

If we use push segue, then use popViewController

@IBAction func backButtonClicked(_ sender: Any) {
    self.navigationController?.popViewController(animated: false)
}
2
votes

In swift you can also call:

self.navigationController?.popToRootViewControllerAnimated(true)
1
votes

On Objective-C is

[self.navigationController popViewControllerAnimated:YES];

for a jump to the first root controller

[self.navigationController popToRootViewControllerAnimated:YES];

or is a possible move to the specific controller

[self.navigationController popToViewController:(nonnull UIViewController *) animated:(BOOL)];

animation specific animation process of move the controller. If the animation is false the controller will appear without animations. The UIViewController must be from one which is on the stack.

0
votes

If NavViewController is used with UIModalPresentationFullScreen then the below line will work

self.navigationController?.dismiss(animated: true, completion: nil)