gabaum10
gabaum10

Reputation: 3827

UINavigationController and viewWillDisappear

So I have a UINavController in my app and am trying to execute a method when the user presses the back button. I have searched everywhere and can only find bits and pieces that don't really make sense out of context.

Is there a way to implement some sort of check that catches when the user presses the back button to dismiss the current view? (the viewWillDisappear method for the view being popped never gets called for some reason. I did read that it doesn't unless you forward that call?) Does that sound right, and does anyone have any ideas or suggestions? Thanks in advance.

Upvotes: 3

Views: 6262

Answers (5)

TPoschel
TPoschel

Reputation: 3872

Take a look at the UINavigationControllerDelegate. There are the only two methods that get called when a UIViewController is pushed to the navigation controller stack. Similarly, if one is being pushed then something probably was just popped. This is what I did to call viewDidDisappear and viewWillDisappear.

# pragma mark - UINavigationControllerDelegate Methods

- (void)navigationController:(UINavigationController *)navigationController 
  willShowViewController:(UIViewController *)viewController animated:(BOOL)animated 
{
    static UIViewController *vcPointer = nil;

    // If the previous view controller is still around then let's send a viewWillDisappear message
    if (vcPointer != nil) {
        if ([vcPointer respondsToSelector:@selector(viewWillDisappear:)]) {
            [vcPointer viewWillDisappear:animated];
        }
    }

    // Keep track of a pointer to the current viewController
    vcPointer = viewController;

    [viewController viewWillAppear:animated];   
}

This code keeps a pointer reference to the last view controller that was pushed so that once we push another one we can pop the last one (if it still exists).

Upvotes: 6

Christian Loncle
Christian Loncle

Reputation: 1584

I used this solution:

  • Add a custom button on the left side in the navigation bar
  • Let that button activate a custom method.

Disadvantage of this workaround: you will lose that nice arrow shaped "back" button. That can be solved as well with a custom image.

So here is my code. Put this in your viewDidLoad:

// LeftButton in Navigation Bar
UIBarButtonItem *leftBarButton = [[UIBarButtonItem alloc] initWithTitle:@"Back" style:UIBarButtonItemStylePlain target:self action:@selector(backButtonPushed:)];
self.navigationItem.leftBarButtonItem = leftBarButton;
[leftBarButton release]; 

Then add this method in the same .m file:

- (void) backButtonPushed: (id)sender  {
// do what you want to do       
}

dont forget in the .h file

- (void) backButtonPushed: (id)sender;

Upvotes: 0

Rod
Rod

Reputation: 779

You can always hide the default back navigation button and create your own with its own method to be called when pressed.

Execute whatever code you want there then pop the view.

Upvotes: 0

Rengers
Rengers

Reputation: 15238

AFAIK, if you add a UINavigationController to a UIView via code, it won't send those messages to it's subviews by default. It will only do this if the UINavigationController received these calls itself. Maybe this is your problem (I don't know your view setup).

So, when adding the view of the UINavigationController, be sure to manually send it these messages.

UINavigationController *navigationController = [UINavigationController alloc] initWithRootViewController:rootViewController];

[navigationController viewWillAppear:NO];
[aView addSubview:navigationController.view];
[navigationController viewDidAppear:NO];

At least, this is what I found during development. Been searching for this for a long time and I still don't understand the rationale behind it.

Upvotes: 2

devinross
devinross

Reputation: 2816

The viewWillDisappear & viewDidDisappear is called when a controller is popped or dismissed. The function is called on the fore-front view controller not on the UINavigationController itself. Did you possibly subclass and forget to call the super on something?

Upvotes: -1

Related Questions