¿Cómo puedo llamar a un método cuando se presiona el botón Atrás en un UINavigationController
? Necesito poder llamar a un método antes de que se muestre la vista anterior. es posible? Si es así, ¿alguien puede aconsejar sobre cómo hacer esto?¿Cómo llamar a un método cuando se presiona el botón Atrás en un UINavigationController? (iPhone)
Respuesta
Una solución rápida es agregar una implementación para el método viewWillDisappear:. Se activará tan pronto como desaparezca el viewController en respuesta a la presión del botón Atrás.
- (void)viewWillDisappear:(BOOL)animated {
//...
//make you stuff here
//...
}
Otra solución es agregar un respondedor personalizado al botón Atrás. Puede modificar el método init de su viewController de la siguiente manera:
- (id)init {
if (self = [super init]) {
//other your stuff goes here
//...
//here we customize the target and action for the backBarButtonItem
//every navigationController has one of this item automatically configured to pop back
self.navigationItem.backBarButtonItem.target = self;
self.navigationItem.backBarButtonItem.action = @selector(backButtonDidPressed:);
}
return self;
}
y luego se puede utilizar un método de selección como el siguiente. Asegúrese de descartar correctamente ViewController; de lo contrario, su controlador de navegación no aparecerá como lo desee.
- (void)backButtonDidPressed:(id)aResponder {
//do your stuff
//but don't forget to dismiss the viewcontroller
[self.navigationController popViewControllerAnimated:TRUE];
}
La manera más fácil sería poner el código en ViewController que se presentará cuando se presiona el botón Atrás. Puede utilizar viewWillAppear
- (void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
//Your code here
}
Tenga en cuenta que esto también se ejecutará cuando la vista se presenta por cualquier otra razón, así que si quieres que ocurra solamente cuando se presiona el botón de retroceso tiene que usar el delegado: UINavigationControllerDelegate
que el método será llamado cuando vc que aparece en absoluto, no necesariamente sólo como resultado de simplemente volver a ella – Colin
@Colin eso es correcto, que depende del comportamiento exacto que quiere, puede usar el delegado, si solo lo quiere cuando se presiona el botón Atrás. –
UIButton *backButton = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, 52, 31)];
[backButton setBackgroundImage:[UIImage imageNamed:@"BackButton.png"] forState:UIControlStateNormal];
//[backButton setTitle:@"CLOSE" forState:UIControlStateNormal];
[backButton setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal];
[backButton.titleLabel setFont:[UIFont boldSystemFontOfSize:14.0f]];
[backButton addTarget:self action:@selector(tappedBackButton:) forControlEvents:UIControlStateHighlighted];
UIBarButtonItem* item = [[UIBarButtonItem alloc] initWithCustomView:backButton];
self.navigationItem.leftBarButtonItem = item;
[item release];
Crea una alfombrilla de botón trasero y el uso de ese selector llamar a un método que desee. Y también use [self.navigationController popViewControllerAnimated: TRUE];
- (void)tappedBackButton:(id)button
{
// call your method here
[self.navigationController popViewControllerAnimated:TRUE];
}
Tenga en cuenta que cuando reemplaza el botón Atrás de esta manera, pierde la función "deslizar desde el borde izquierdo para volver a la vista padre control", que se introdujo en iOS 7 y es útil acceso directo en iPhone 6 y 6+ –
Esto no está funcionando con self.navigationItem.rightBarButtonItem ... Por favor, dé otra solución – Vidhi
creo que he encontrado una manera "limpia" para hacer eso:
En primer lugar, establecer el controlador de vista del cumplimiento de un protocolo de UINavigationControllerDelegate
@interface MyViewController() <UINavigationControllerDelegate>
Entonces, lo definen como el delegado
- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view.
// Set this View Controller as the navigation controller delegate
self.navigationController.delegate = self;
}
Por último, utilice este método desde el UINavigationControllerDeleg protocolo de ATE:
#pragma mark - Navigation controller delegate
- (void)willMoveToParentViewController:(UIViewController *)parent
{
// If there is no parent, then it means that the view controller has been removed from the stack, which happens when the back button has been pressed
if (!parent) {
NSLog(@"Back button pressed");
// it can be useful to store this into a BOOL property
self.backButtonPressed = YES;
}
}
- 1. Simulando el botón Atrás de la UINavigationController en el iPhone
- 2. ¿Cómo elimino una actividad cuando se presiona el botón Atrás?
- 3. guarda el estado cuando se presiona el botón Atrás
- 4. Botón Atrás personalizado en UINavigationController
- 5. setResult no funciona cuando se presiona el botón ATRÁS
- 6. Llamar a un botón específico en el evento Click cuando se presiona la tecla enter C#
- 7. Cómo saber cuándo se presiona el botón Atrás en una UINavigationControllerStack
- 8. Borrar el foco EditText cuando se presiona el botón Atrás cuando el teclado está mostrando
- 9. El botón Atrás de UINavigationController desaparece?
- 10. Averiguar si el usuario presionó el botón Atrás en uinavigationcontroller?
- 11. Android - Detener AsyncTask cuando se presiona el botón Atrás y volver a la Actividad anterior
- 12. ¿Cómo mostrar el botón Atrás en RootViewController del UINavigationController?
- 13. UINavigationController Botón Atrás no visible, pero funciona
- 14. ¿Cómo realizo la página de recarga de Firefox cuando se presiona el botón Atrás?
- 15. Diálogo que se muestra dos veces cuando se presiona el botón Atrás
- 16. Cómo volver a cargar la página cuando se presiona atrás, después de un pushState?
- 17. Android: Pedir al usuario que guarde los cambios cuando se presiona el botón Atrás
- 18. Retener datos en páginas personalizadas cuando se presiona el botón Atrás
- 19. Cambiar la imagen en UIButton cuando el usuario presiona ese botón en un iPhone
- 20. VBA Cómo forzar a una función a regresar cuando se presiona un botón de formulario
- 21. iPhone realiza una acción cuando se presiona el botón borrar UITextField/UISearchBar
- 22. Forzar el cierre de una aplicación de iPhone cuando se presiona el botón Inicio (en iOS4)
- 23. Llamar a un método haciendo clic en un botón en un UIWebView
- 24. Aumenta continuamente el valor entero cuando se presiona el botón
- 25. Repita una acción cuando se presiona el botón largo
- 26. cómo desactivar el botón Atrás en Android
- 27. Detectar cuando se presiona el botón de inicio iOS
- 28. ¿Cómo volver atrás una vista en UINavigationController?
- 29. negociación contenido ignorado cuando se utiliza el navegador botón Atrás
- 30. enrutamiento de backbone detectando si se presiona adelante o atrás
Una diferencia entre los dos es que se llama a la primera solución (es decir, 'viewWillDisappear') al retroceder o avanzar en la pila de navegación. La segunda solución es solo para regresar. – Matthew
Esto normalmente no funcionará, ya que encontrará que backBarButtonItem es nulo a menos que le asigne explícitamente un botón. De todos modos, en mi experiencia, leftBarButtonItem y backBarButtonItem eran nulos. – Diziet
no funciona –