¿Cómo puedo determinar si se muestra un button de retroceso?

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

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

if (self.navigationItem.backBarButtonItem)

y esto:

if (self.navigationItem.leftBarButtonItem)

Ninguno de esos trabajos: son siempre nulos (la expresión se evalúa como falsa), incluso cuando hay un button de retroceso en la pantalla. Lo que finalmente me gustaría hacer es establecer un button Cancelar como self.navigationItem.leftBarButtonItem , pero solo si no hay ningún button de retroceso. Si hay un button de retroceso, no necesitamos el button Cancelar. Tal como está, al establecer leftBarButtonItem se leftBarButtonItem el button Atrás, por lo que estamos viendo un button Cancelar todo el time, incluso cuando debería haber un button Atrás.

Estás pidiendo el object incorrecto por su backBarButtonItem . Esta propiedad controla cómo se representa un object cuando se trata del elemento "atrás" en la stack de navigation.

Por lo tanto, debe preguntarle al controller de vista en el nivel inferior donde se encuentra en la stack de navigation qué es su backBarButtonItem :

 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 deba comprobar si el controller de navigation ha agregado su viewController a la stack al momento de ejecutar este código, el controller de vista superior puede seguir siendo el anterior. viewWillAppear la vista viewWillAppear y la stack contiene el nuevo controller superior en este punto.

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

este código funciona, está en viewDidAppear, si su controller es nulo, no hay ningún button, así que agrego el button Cancelar, no es un elemento posterior, solo un regular:] espero que esto ayude

loadView es demasiado pronto. Lo más pronto que pueda comprobar esto es en viewDidLoad . Es posible que deba esperar a viewWillAppear .

Busca lo siguiente

 self.navigationController.navigationBar.backItem 

en lugar de backBarButtonItem .

Si hay backItem , entonces estás en la stack de navigation más allá de rootViewController.