views:

467

answers:

2

Hi,

I am creating an application based on the Utility template. The main screen consists of a menu with several buttons, each of which creates a different flip-side view. In one of those flip-side views I also configured a Navigation Controller, which works perfectly as long as I have the NavigationBar activated... I can push the view but I have to use the "back" button to return to my flip-side view, which would be the root of the Navigation Controller. The problem comes if I try to go back using "popViewControllerAnimated", properly configured with a button, instead of the "back" button of the NavigationBar. My application crashes for some reason and I am not able to understand why.

I could just use the "back" button in the NavigationBar and forget about the problem, but I would prefer to have my own button in order to go back.

My app consists of the following:

My APPDelegate.m:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {    

    MenuViewController *menuController = [[MenuViewController alloc] initWithNibName:@"MenuView" bundle:nil];
    self.menuViewController = menuController;
    [menuController release];

    menuViewController.view.frame = [UIScreen mainScreen].applicationFrame;
    [window addSubview:[menuViewController view]];
    [window makeKeyAndVisible];

    return YES;
}

MenuViewController.m starting my flip-side view:

- (IBAction)showFuelUpliftView {    

    FuelUpliftViewController *controller = [[FuelUpliftViewController alloc] 
                                            initWithNibName:@"FuelUpliftView" bundle:nil];
    controller.delegate = self;
    controller.title = @"Fuel Uplift";

    UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:controller];
    [navController setNavigationBarHidden: NO];
    navController.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal;
    [self presentModalViewController:navController animated:YES];

    [navController release];
    [controller release];
}

FuelUpliftViewController.m, where I push the second view of the NavigationController with a button:

- (IBAction)showFuelUplift2View:(id)sender {
    UIViewController *controller = [[UIViewController alloc] initWithNibName:@"FuelUplift2View" bundle:nil];
    controller.title = @"Settings";
    [self.navigationController pushViewController:controller animated:YES];
    [controller release];
}

And finally, my FuelUplift2ViewController.m, where the app crashes when trying to go back:

- (IBAction)backFromFuelUplift2View {
    [self.navigationController popViewControllerAnimated:YES];
}

I do not know if all this makes sense, I am currently beginning with my first application and am still learning thanks to the traditional trial an error method. Nevertheless, I cannot see the reason for this problem and would appreciate any help I can get.

Thanks very much,

Manu

A: 

When asking about a crash, it is a very good idea to show the message you get.

There is nothing obviously wrong in the code you show, although the "self.delegate" line makes me suspicious. You should check how the property is declared, and if you are double releasing it.

Paul Lynch
Many thanks for the reply! I definitely need to check that delegate; my app is based on the Utility one included in Xcode, so I'm using the same structure and haven't changed anything related to the delegate. It must have something to do with it, anyway, because I've been able to make other apps work with popViewControllerAnimated when not using a delegate.The message I get (hope this is what you mean), is:*** Terminating app due to uncaught exception zNSInvalidArgumentException', reason: '*** -[UIViewController backFromFuelUplift2View]: unrecognized selector sent to instance 0x3917440'
Manu
One doubt I have about all this is: why does it work perfectly if I press the "Back" button in the NavigationBar but not if I create my own method with popViewControllerAnimated? Are they not supposed to do exactly the same?
Manu
The error message tells you all. You are sending the back message to the wrong object.
Paul Lynch
Thanks Paul, I just saw you message here. I already realized what the problem was (now I feel a little bit stupid)... and indeed, I was sending the message to the wrong object. Thanks for the help!
Manu
A: 

I was finally able to solve my problem.

In order to create the second view in my UINavigationController, I had this:

- (IBAction)showFuelUplift2View:(id)sender {
    UIViewController *controller = [[UIViewController alloc] initWithNibName:@"FuelUplift2View" bundle:nil];
    controller.title = @"Settings";
    [self.navigationController pushViewController:controller animated:YES];
    [controller release];
}

I took that code from another forum and it did work straight away, so I could not imagine that I was going to have problems with it. With the above code, if I understand it correctly, I'm creating a new UIViewController for my second view, and that's why I was able to switch to that second view and have a working "Back" button.

Anyhow, in order to configure my own button to go back, I should have written the following:

FuelUplift2ViewController *controller = [[FuelUplift2ViewController alloc] initWithNibName:@"FuelUplift2View" bundle:nil];

Apparently I was initializing correctly a random UIViewController, but as I was not indicating properly which one it was (FuelUplift2ViewController), my method to return to the first view could not work properly.

This was maybe a very basic question, but it took me several hours to realize the problem and I am glad I could find it by myself, juts following my code and using a little bit of common sense.

Manu