13

Tengo un UINavigationController que contiene 3 UIViewControllers en la pila.UINavigationController: Ocultar el botón Atrás en una vista Lo oculta en todas las vistas

View A - is the root 
View B - is pushed by View A and has `self.navigationItem.hidesBackButton = YES;` 
View C - is pushed by View B and has `self.navigationItem.hidesBackButton = NO;` 

La vista C no muestra el botón Atrás, aunque tengo HidesBackButton establecido en NO. ¿Cómo puedo resolver esto?

+0

¿Puedes decir el título de la vista B? –

+0

Ver B - self.title = @ "Ofertas" –

+0

\ Alam debe intentar archivar un error con apple o simplemente dejar un correo pidiendo ayuda. –

Respuesta

15

actualización
Un posible error en 4.2, ya que funciona hasta 4.1 SDK

He intentado esto y la mía está funcionando perfectamente. Acabo de publicar la implementación de B view controller (BVC) y C view controller (CVC). Mi suposición inicial es que no está estableciendo el título de BVC en viewDidLoad.

@implementation BVC 


// Implement viewDidLoad to do additional setup after loading the view, typically from a nib. 
- (void)viewDidLoad { 
    [super viewDidLoad]; 
    self.navigationItem.title = @"I am B"; 
} 


- (void) viewWillAppear:(BOOL)animated{ 
    self.navigationItem.hidesBackButton = YES; 
} 

- (IBAction)pushB:(UIButton *)sender{ 
    CVC *cvc = [[CVC alloc] initWithNibName:@"CVC" bundle:nil]; 
    [self.navigationController pushViewController:cvc animated:YES]; 
    [cvc release]; 
} 
@end 

@implementation CVC 

- (void) viewWillAppear:(BOOL)animated{ 
    self.navigationItem.hidesBackButton = NO; 
} 
@end 
+0

+1, me ayudó, pero en realidad tengo que ocultarlo para todas mis vistas, pero no puedo hacerlo. He escrito esto en cada Vista :( – mAc

0

Cuando regrese (sin importar si lo está haciendo), restablezca la propiedad hidesBackButton al YES. Por ejemplo, en el método de viewWillAppear:, hacer algo como

@implementation SomeViewController 

- (void) viewWillAppear:(BOOL)animated { 
    self.navigationController.navigationItem.hidesBackButton = YES; 
    [super viewWillAppear:animated]; 
} 

@end 

Calculo que sería tan simple como eso, pero puedo estar equivocado. Después de todo, el elemento de navegación es propiedad de UINavigationController, por lo que tiene sentido para mí que los cambios realizados en él no se guarden/restauren dependiendo de qué UIViewController se encuentre en la pila de UINavigationController.

+0

Intenté eso, desafortunadamente, no funciona. –

+0

Lo probé yo mismo y estoy obteniendo lo mismo. Ahora estoy confundido. – nil

+0

mira mi respuesta. –

8

Creo que tiene que establecer esa propiedad antes de empujar o hacer estallar un controlador de vista para afectar al siguiente controlador de vista, estableciéndolo para el controlador de vista actual en la vista Will'Appear es demasiado tarde.

Editar: ¡esto parece un error en 4.2! El botón Atrás permanece oculto tanto en el simulador 4.2 como en el dispositivo con 4.2, pero funciona en los simuladores 3.2, 4.1 y 4.0.

Aquí está el código en la que al empujar un VC con la espalda oculta un botón:

- (IBAction) goto2nd 
{ 
    SecondVC *vc = [[[SecondVC alloc] initWithNibName:@"SecondVC" bundle:nil] autorelease]; 
    vc.navigationItem.hidesBackButton = YES; 
    [self.navigationController pushViewController:vc animated:YES]; 
} 

Eso es todo lo que debe ser necesario, cada VC tiene su propio navigationItem, no es una configuración global, por lo que don' Necesito preocuparme por deshacerlo para restaurar el botón Atrás (al menos cuando aparece de nuevo en un VC donde está establecido en "NO").

+0

todavía no hubo suerte. intenté 'viewB.navigationItem.hidesBackButton = YES' antes de presionar y' viewC.navigationItem.hidesBackButton = NO' antes de presionar sin suerte. –

+0

OK Estoy viendo lo mismo - raro, mirándolo – Bogatyr

+0

Parece una 4.2 error! – Bogatyr

0

Tengo el mismo problema y solo ocurre en el simulador iOS 4.2, por lo que probablemente sea un error en esa versión.

reeditar:

intento con esto, que trabajó para mí:

- (void)viewDidAppear:(BOOL)animated { 

    [super viewDidAppear:animated]; 
    self.navigationItem.hidesBackButton = NO; 
} 
1

La solución para este problema es algo tricky..just intentarlo seguramente va a trabajar, ya que incluso me enfrenté al mismo problema .

Primer juego Título de navegación en viewWillAppear.

- (void)viewWillAppear:(BOOL)animated 
{ 
    [super viewWillAppear:animated]; 
    self.navigationItem.title = @"SET YOUR TITLE"; 
} 

Mientras se desplaza a otra página acaba de establecer el título de navegación para null.This no mostrará ningún botón en top.Since usted puede deshacerse de escribir self.navigationItem.hidesBackButton = YES; cada vez.

- (IBAction)pushB:(UIButton *)sender 
{ 
    SecondVC *vc = [[[SecondVC alloc] initWithNibName:@"SecondVC" bundle:nil] autorelease]; 
    self.navigationItem.title = @""; 
    [self.navigationController pushViewController:vc animated:YES]; 
    [vc release]; 
} 
0

utilizar el método de UINavigationControllerDelegate -navigationController:willShowViewController:animated:. Va a implementar esto en vista controlador A y B. En vista del controlador de A podrá establecer -hidesBackButton: a YES y alternativamente a NO en vista controlador B.

- (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated 
{ 
    viewController.hidesBackButton = YES; 
} 
0

También puede utilizar código de ejemplo;

- (void) viewWillAppear:(BOOL)animated{ 
    self.navigationItem.hidesBackButton = YES; 
} 

- (void) viewWillDisappear:(BOOL)animated{ 
    self.navigationItem.hidesBackButton = NO; 
} 
0

Si su vista es realmente jerarquía tal que Vista B debe no mostrar un botón de retroceso, pero debería Vista C , a continuación, la forma más sencilla de evitar esto es refactorizar su jerarquía. Estoy pensando en la siguiente alternativa:

Ver A llama presentModalViewController:animated: en View B *, una propiedad UINavigationController cuya view es empuja Ver B. Vista B * C Vista en su pila de navegación en respuesta a un evento (o no) desde la Vista B. Si necesita regresar a Ver A rápidamente y luego llamar al dismissModalViewControllerAnimated: en la Vista A. Si desea mantener el estado de Ver B * y C en la memoria, también puede mantener otro puntero a Ver B * en algún lugar no desaparece cuando se descarta.

6

Aquí hay una solución que estoy usando con éxito en 4.3.

En vez de ocultar el botón de retroceso, establece la vista botón de la barra izquierda de una vista vacía:

UIView *tmpView = [[UIView alloc] initWithFrame:CGRectZero]; 
UIBarButtonItem *tmpButtonItem = [[UIBarButtonItem alloc] initWithCustomView:tmpView]; 
[tmpView release]; 
self.navigationItem.leftBarButtonItem = tmpButtonItem; 
[tmpButtonItem release]; 

para restaurar el botón de retroceso, acaba de establecer el elemento botón de la barra izquierda a nil:

[self.navigationItem setLeftBarButtonItem:nil animated:YES]; 

Actualización: Parece que el error desapareció en 4.3.

Nota: Aunque el error parece ser fijo, prefiero la técnica de "vista vacía" porque permite la animación de la desaparición y reaparición del botón Atrás.

+0

Este enfoque elimina por completo el botón [ HBublitz

Cuestiones relacionadas