2009-10-23 11 views
6

Tengo un problema relacionado con el UINavigationController.¿Cómo reinicio un UINavigationController?

Tengo una aplicación que tiene tres controladores de vista que estoy cambiando entre el uso de la funcionalidad push y pop de los controladores de navegación.

El problema es el siguiente: yo estoy en el tercer controlador de vista y hace una llamada a
[self.navigationController popToRootViewControllerAnimated: YES];
esto me lleva al primer controlador de vista (que es exactamente lo que quiero) pero cuando trato de navegar al segundo controlador de vista termino en el tercero por alguna razón.

¿Hay alguna manera de reiniciar el controlador de navegación, o estoy haciendo esto de la manera incorrecta?

Aquí está el código que estoy usando para empujar y hacer estallar el control de navegación:

El siguiente código se llama en el controlador de vista raíz cuando el usuario decide iniciar la cámara.

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

El siguiente código es llamado desde CollageCameraViewController (segundo) después de que el usuario ha tomado su 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]; 

El siguiente código es llamado desde CollageRenderViewController cuando el usuario decide volver a la vista principal (raíz):

[self.navigationController popToRootViewControllerAnimated:YES]; 

Ahora, si intento presionar CollageCameraViewController de nuevo, termino en CollageRenderViewController, ¿por qué?

Saludos, Andreas

+0

Publique algunos de sus códigos para que podamos ver cómo está presionando/haciendo estallar sus controles de visualización y qué es exactamente lo que está presionando y haciendo estallar. – Jasarien

Respuesta

2

vez que el pop al controlador de vista raíz, se trata de "reset". Su próxima acción con el navigationController debe ser presionar (o volver a presionar) el controlador de vista apropiado. No deberías estar tratando de "navegar" a través de la pila.

Actualizado:

he creado un proyecto de iPhone basado en la navegación para probar el código y funciona. Cada una de mis tres vistas tiene un solo botón que envía a su controlador su mensaje IBAction cuando se toca.

Aquí está mi código:

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

¿Cómo vuelvo a presionar un controlador de vista? He agregado el código que maneja el empuje y el popping de arriba, ¿tienes alguna sugerencia? – drisse

+0

¿Qué quiere decir con "volver a presionar"? ¿Lo entendiste? – gerry3

5

Tengo varios VCs en mi pila como pantallas de configuración antes de moverme a la pantalla de inicio verdadera.

yo tengo la mía para trabajar de esta manera:

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

pulso el HomeViewController y vuelva a grabar la pila de tener solo la pantalla de inicio.

Cuestiones relacionadas