开发者

How do I reset a UINavigationController?

开发者 https://www.devze.com 2022-12-09 19:35 出处:网络
I have a problem involving the UINavigationController. I have a application that have three view controllers that I\'m switching between using the navigation controllers push and pop functionality.

I have a problem involving the UINavigationController.

I have a application that have three view controllers that I'm switching between using the navigation controllers push and pop functionality.

The problem is this: I stand in the third view controller and makes a call to

[self.navigationController popToRootViewControllerAnimated:YES];

this brings me to the first view controller (which is exactly what I want) but when I then try to navigate to the second view controller I end up in the third for some reason.

Is there any way you can reset the navigation controller, or am I doing this the wrong way?

Here is the code that I'm using to push and pop the navigation controller:

The following code is called in the root view controller when the user decides to launch the camera.

if(self.cameraViewController == nil)
{
        CollageCameraViewController *camView = [[CollageCameraViewController alloc] init];//WithNibName:nil bundle:[NSBundle mainBundle]];
        self.cameraViewController = camView;
        [camView release];开发者_高级运维

}
[self.navigationController pushViewController:self.cameraViewController animated:NO];

The following code is called from CollageCameraViewController (second) after the user has taken his fotos:

if(self.renderView == nil)
{
    CollageRenderViewController *renderViewController = [[CollageRenderViewController alloc] initWithNibName:nil bundle:[NSBundle mainBundle]];
    self.renderView = renderViewController;
    [renderViewController release];
}
[self.navigationController pushViewController:self.renderView animated:YES];

The following code is called from CollageRenderViewController when the user decides to go back to main (root) view:

[self.navigationController popToRootViewControllerAnimated:YES];

Now, if I try to push CollageCameraViewController again I end up in CollageRenderViewController instead, why is that?

Cheers, Andreas


I have several VCs in my stack as set-up screens before I move to the true home screen.

I got mine to work like this:

HomeViewController *hvc = [[HomeViewController alloc] init];
[self.navigationController pushViewController:hvc animated:YES];
self.navigationController.viewControllers = [[NSArray alloc] initWithObjects:hvc, nil];

I push the HomeViewController and then rewrite the stack to only have the home screen.


Once you pop to the root view controller, it is "reset". Your next action with the navigationController should be to push (or re-push) the appropriate view controller. You should not be trying to "navigate" through the stack.

UPDATED:

I created a navigation-based iPhone project to test your code and it works. Each of my three views has a single button which sends its controller its IBAction message when tapped.

Here is my code:

RootViewController.h:

@class SecondViewController;

@interface RootViewController : UIViewController {
    SecondViewController *secondViewController;
}

@property (nonatomic, retain) SecondViewController *secondViewController;

- (IBAction)pushSecondVC;

@end

RootViewController.m:

#import "RootViewController.h"
#import "SecondViewController.h"

@implementation RootViewController

@synthesize secondViewController;

- (IBAction)pushSecondVC {
    if(self.secondViewController == nil)
    {
        SecondViewController *secondVC = [[SecondViewController alloc] init];
        self.secondViewController = secondVC;
        [secondVC release];
    }
    [self.navigationController pushViewController:self.secondViewController animated:NO];
}

- (void)viewDidLoad {
    [super viewDidLoad];

    self.title = @"Root View";
}

SecondViewController.h:

#import <UIKit/UIKit.h>

@class ThirdViewController;

@interface SecondViewController : UIViewController {
    ThirdViewController *thirdViewController;
}

@property (nonatomic, retain) ThirdViewController *thirdViewController;

- (IBAction)pushThirdVC;

@end

SecondViewController.m:

#import "SecondViewController.h"
#import "ThirdViewController.h"

@implementation SecondViewController

@synthesize thirdViewController;

- (IBAction)pushThirdVC {
    if(self.thirdViewController == nil)
    {
        ThirdViewController *thirdVC = [[ThirdViewController alloc] initWithNibName:nil bundle:[NSBundle mainBundle]];
        self.thirdViewController = thirdVC;
        [thirdVC release];
    }
    [self.navigationController pushViewController:self.thirdViewController animated:YES];
}

- (void)viewDidLoad {
    [super viewDidLoad];

    self.title = @"2nd View";
}

ThirdViewController.h:

#import <UIKit/UIKit.h>

@interface ThirdViewController : UIViewController {
}

- (IBAction)popToRoot;

@end

ThirdViewController.m:

#import "ThirdViewController.h"

@implementation ThirdViewController

- (IBAction)popToRoot {
    [self.navigationController popToRootViewControllerAnimated:YES];
}

- (void)viewDidLoad {
    [super viewDidLoad];

    self.title = @"3rd View";
}
0

精彩评论

暂无评论...
验证码 换一张
取 消