2009-10-23 16 views
6

Ich habe ein Problem mit dem UINavigationController.Wie setze ich einen UINavigationController zurück?

Ich habe eine Anwendung, die drei View-Controller haben, die ich mit den Push-und Pop-Funktionalität der Navigations-Controller wechseln.

Das Problem ist folgendes: ich in der dritten View-Controller stehen und macht einen Aufruf an
[self.navigationController popToRootViewControllerAnimated: YES];
Das bringt mich zum ersten View-Controller (was genau ich will), aber wenn ich dann versuche, zum zweiten View-Controller zu navigieren, lande ich aus irgendeinem Grund im dritten View-Controller.

Gibt es eine Möglichkeit, den Navigationscontroller zurückzusetzen, oder mache ich das falsch?

Hier ist der Code, den ich mit den Navigation-Controller drücken und Pop:

Der folgende Code in der Stammansicht Controller aufgerufen wird, wenn der Benutzer die Kamera starten entscheidet.

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]; 

Der folgende Code wird von CollageCameraViewController (zweiten) aufgerufen, nachdem der Benutzer seine Fotos gemacht hat:

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]; 

Der folgende Code aus CollageRenderViewController wird aufgerufen, wenn der Benutzer zurück zu gehen entscheidet zur Hauptansicht:

[self.navigationController popToRootViewControllerAnimated:YES]; 

Wenn ich nun versuche, CollageCameraViewController erneut zu drücken, lande ich stattdessen in CollageRenderViewController, warum ist das so?

Cheers, Andreas

+0

Poste etwas von deinem Code, damit wir sehen können, wie du deine View-Controller drückst/knallst und was genau du drückst und knallst. – Jasarien

Antwort

2

Sobald Sie mit dem Root-Ansicht-Controller Pop wird "Reset". Ihre nächste Aktion mit dem navigationController sollte sein, den entsprechenden View-Controller zu drücken (oder erneut zu drücken). Sie sollten nicht versuchen, durch den Stapel zu "navigieren".

AKTUALISIERT:

Ich habe ein Navigation-basierte iPhone-Projekt den Code zu testen, und es funktioniert. Jede meiner drei Ansichten hat eine einzige Schaltfläche, die dem Controller beim Tippen die IBAction-Nachricht sendet.

Hier ist mein 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

Wie schiebe ich einen View-Controller erneut? Ich habe den Code hinzugefügt, der das Schieben und Poppen oben behandelt. Hast du irgendwelche Vorschläge? – drisse

+0

Was meinst du mit "re-push"? Hast du das herausgefunden? – gerry3

5

Ich habe mehrere VCs in meinem Stack als Set-up-Bildschirm, bevor ich zum wahren Home-Bildschirm zu bewegen.

Ich habe mir so arbeiten:

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

ich die HomeViewController drücken und dann den Stapel neu zu schreiben, um nur den Bildschirm zu Hause haben.

Verwandte Themen