2011-10-27 20 views
5

En una aplicación de iOS, ¿cómo puedo determinar si se muestra un botón de retroceso? Idealmente, me gustaría saber esto en el método loadView de mi controlador.¿Cómo puedo determinar si se muestra un botón de retroceso?

Esto es lo que he probado en loadView, viewDidLoad y viewWillAppear:

if (self.navigationItem.backBarButtonItem)

y esto:

if (self.navigationItem.leftBarButtonItem)

Ninguno de los trabajos - son siempre cero (la expresión se evalúa como falsa), incluso cuando hay un botón Atrás en la pantalla. Lo que en última instancia me gustaría hacer es establecer un botón Cancelar como self.navigationItem.leftBarButtonItem, pero solo si no hay un botón de retroceso. Si hay un botón Atrás, no necesitamos el botón Cancelar. Tal como está, la configuración del leftBarButtonItem está anulando el botón Atrás, por lo que estamos viendo un botón Cancelar todo el tiempo, incluso cuando debería haber un botón Atrás.

Respuesta

16

Está pidiendo el objeto incorrecto para su backBarButtonItem. Esta propiedad controla cómo se representa un objeto cuando es el elemento "posterior" en la pila de navegación.

Por lo tanto, tiene que estar pidiendo el controlador de vista a nivel continuación dónde se encuentra en la pila de navegación lo que su backBarButtonItem es:

int n = [self.navigationController.viewControllers count] - 2; 
if (n >= 0) 
    if ([(UIViewController*)[self.navigationController.viewControllers objectAtIndex:n]navigationItem].backBarButtonItem == nil) 
     // Do your thing.... 

Es posible que necesite para comprobar si el controlador de navegación ha añadido su viewController a la pila en el momento en que está ejecutando este código, el controlador de vista superior aún puede ser el anterior. He registrado viewWillAppear y la pila contiene el nuevo controlador superior en este momento.

0

loadView es demasiado temprano. Lo más temprano que pueda verificar esto es en viewDidLoad. Es posible que deba esperar viewWillAppear.

+0

Gracias por responder. Acabo de probar mis dos afirmaciones 'if' de la pregunta en la mira WillAppear, y estoy obteniendo los mismos resultados; todavía son nulas y, por lo tanto, no me dicen lo que quiero saber. –

+0

Asegúrate de que 'self.navigationItem' no sea' nil'. La última vez que esto podría aplicarse es 'viewDidAppear'. Si no lo ves allí, no estás obteniendo el objeto correcto. –

+0

Gracias de nuevo. He verificado que 'self.navigationItem' no es nulo. Probé esto en 'viewDidAppear' y todavía obtengo los mismos resultados. –

3
NSLog(@"%@",self.navigationController.navigationBar.backItem); 
if (self.navigationController.navigationBar.backItem == NULL) { 
    UIBarButtonItem *cancelButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemCancel target:self action:@selector(addLaunch)]; 
    self.navigationItem.leftBarButtonItem = cancelButton; 
    [cancelButton release]; 
} 

funciona este código, está en el viewDidAppear, si el controlador es nulo, theres ningún botón, por lo que añado el botón de cancelación, no es un artículo de nuevo sin embargo, sólo un habitual:] espero que esta ayuda

0

Búsqueda de la siguiente

self.navigationController.navigationBar.backItem 

en lugar de backBarButtonItem.

Si existe backItem, entonces está en la pila de navegación más allá de rootViewController.

Cuestiones relacionadas