How to trap the back button event

ios, iphone

Solution

You can implement the `viewWillDisappear` method of UIViewController. This gets called when your controller is about to go away (either because another one was pushed onto the navigation controller stack, or because the 'back' button was pressed).

To determine whether the view is disappearing because of the back button being pressed, you can use a custom flag that you set wherever you push a new controller onto the navigation controller, like shown below

- (void)viewWillDisappear:(BOOL)animated {
    [super viewWillDisappear:animated];
    if (viewPushed) {
        viewPushed = NO;   // Flag indicates that view disappeared because we pushed another controller onto the navigation controller, we acknowledge it here
    } else {
        // Here, you know that back button was pressed
    }   
}

And wherever you push a new view controller, you would have to remember to also set that flag...

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    ...
    viewPushed = YES;
    [self.navigationController pushViewController:myNewController animated:YES];
    ...
}

Problem

I have a UITableViewController that launches a UIViewController and I would like to trap whenever the back button is pressed in the child controller, which is the class that derives from 'UIViewController'. I can change the Back Button title but setting the target & action values when setting the backBarButtonItem seems to get ignored. What's a way to receiving some kind of notification that the Back button was tapped? ``` - (void)showDetailView { // How I'm creating & showing the detail controller MyViewController *controller = [[MyViewController alloc] initWithNibName:@"MyDetailView" bundle:nil]; UIBarButtonItem *backButton = [[UIBarButtonItem alloc] initWithTitle:@"Pages" style:UIBarButtonItemStyleBordered target:self action:@selector(handleBack:)]; self.navigationItem.backBarButtonItem = backButton; [backButton release]; [self.navigationController pushViewController:controller animated:animated]; [controller release]; } - (void)handleBack:(id)sender { // not reaching here NSLog(@"handleBack event reached"); } ```

Original source

Related problems