vuelve volver sirven que por para los inicio gestos flotante control como boton atras ios callback uinavigationcontroller uinavigationitem back

ios - volver - gestos iphone 7



devolución de llamada del botón de retroceso en navigationController en iOS (11)

Aquí hay otra forma en que implementé (no lo probé con un ciclo de desenrollado pero probablemente no se diferenciaría, como otros lo han expresado con respecto a otras soluciones en esta página) para que el controlador de vista padre realice acciones antes de que el VC hijo empuje se quita de la pila de vista (utilicé esto un par de niveles del UINavigationController original). Esto también podría usarse para realizar acciones antes de que el childVC sea empujado también. Esto tiene la ventaja adicional de trabajar con el botón Atrás del sistema iOS, en lugar de tener que crear un UIBarButtonItem o UIButton personalizado.

  1. Haga que su VC padre adopte el protocolo UINavigationControllerDelegate y regístrese para delegar mensajes:

    MyParentViewController : UIViewController <UINavigationControllerDelegate> -(void)viewDidLoad { self.navigationcontroller.delegate = self; }

  2. Implemente este método de instancia MyParentViewController en MyParentViewController :

    - (id<UIViewControllerAnimatedTransitioning>)navigationController:(UINavigationController *)navigationController animationControllerForOperation:(UINavigationControllerOperation)operation fromViewController:(UIViewController *)fromVC toViewController:(UIViewController *)toVC { // Test if operation is a pop; can also test for a push (i.e., do something before the ChildVC is pushed if (operation == UINavigationControllerOperationPop) { // Make sure it''s the child class you''re looking for if ([fromVC isKindOfClass:[ChildViewController class]]) { // Can handle logic here or send to another method; can also access all properties of child VC at this time return [self didPressBackButtonOnChildViewControllerVC:fromVC]; } } // If you don''t want to specify a nav controller transition return nil; }

  3. Si especifica una función de devolución de llamada específica en el método de instancia UINavigationControllerDelegate anterior

    -(id <UIViewControllerAnimatedTransitioning>)didPressBackButtonOnAddSearchRegionsVC:(UIViewController *)fromVC { ChildViewController *childVC = ChildViewController.new; childVC = (ChildViewController *)fromVC; // childVC.propertiesIWantToAccess go here // If you don''t want to specify a nav controller transition return nil;

    }

He pulsado una vista en el controlador de navegación y cuando presiono el botón Atrás, va a la vista anterior automáticamente. Quiero hacer algunas cosas cuando se presiona el botón Atrás antes de sacar la vista de la pila. ¿Cuál es la función de devolución de llamada del botón hacia atrás?


En mi opinión, la mejor solución.

- (void)didMoveToParentViewController:(UIViewController *)parent { if (![parent isEqual:self.parentViewController]) { NSLog(@"Back pressed"); } }

Pero solo funciona con iOS5 +


Esta es la forma correcta de detectar esto.

- (void)willMoveToParentViewController:(UIViewController *)parent{ if (parent == nil){ //do stuff } }

este método se llama cuando también se empuja la vista. Entonces, ver parent == nil es para mostrar el controlador de vista desde la pila


Esto es lo que funciona para mí en Swift:

override func viewWillDisappear(_ animated: Bool) { if self.navigationController?.viewControllers.index(of: self) == nil { // back button pressed or back gesture performed } super.viewWillDisappear(animated) }


Hay una manera más apropiada que preguntarle a ViewControllers. Puede hacer que su controlador sea un delegado de la barra de navegación que tiene el botón Atrás. Aquí hay un ejemplo. En la implementación del controlador donde desea manejar presionando el botón Atrás, dígale que implementará el protocolo UINavigationBarDelegate:

@interface MyViewController () <UINavigationBarDelegate>

Luego, en algún lugar de su código de inicialización (probablemente en viewDidLoad), haga que su controlador sea el delegado de su barra de navegación:

self.navigationController.navigationBar.delegate = self;

Finalmente, implemente el método shouldPopItem. Este método se llama correcto cuando se presiona el botón Atrás. Si tiene varios controladores o elementos de navegación en la pila, probablemente desee comprobar cuál de esos elementos de navegación se está volviendo (el parámetro del elemento), para que solo haga sus cosas personalizadas cuando lo desee. Aquí hay un ejemplo:

-(BOOL)navigationBar:(UINavigationBar *)navigationBar shouldPopItem:(UINavigationItem *)item { NSLog(@"Back button got pressed!"); //if you return NO, the back button press is cancelled return YES; }


La answer William Jockusch resuelve este problema con un truco fácil.

-(void) viewWillDisappear:(BOOL)animated { if ([self.navigationController.viewControllers indexOfObject:self]==NSNotFound) { // back button was pressed. We know this is true because self is no longer // in the navigation stack. } [super viewWillDisappear:animated]; }


Para "ANTES de sacar la vista de la pila":

- (void)willMoveToParentViewController:(UIViewController *)parent{ if (parent == nil){ NSLog(@"do whatever you want here"); } }


Si está utilizando un Storyboard y viene de una transición de inserción, también puede anular shouldPerformSegueWithIdentifier:sender:


Si no puede usar "viewWillDisappear" o un método similar, intente subclase UINavigationController. Esta es la clase de encabezado:

#import <Foundation/Foundation.h> @class MyViewController; @interface CCNavigationController : UINavigationController @property (nonatomic, strong) MyViewController *viewController; @end

Clase de implementación:

#import "CCNavigationController.h" #import "MyViewController.h" @implementation CCNavigationController { } - (UIViewController *)popViewControllerAnimated:(BOOL)animated { @"This is the moment for you to do whatever you want" [self.viewController doCustomMethod]; return [super popViewControllerAnimated:animated]; } @end

Por otro lado, debe vincular este viewController a su NavigationController personalizado, por lo que, en su método viewDidLoad para su viewController regular, haga esto:

@implementation MyViewController { - (void)viewDidLoad { [super viewDidLoad]; ((CCNavigationController*)self.navigationController).viewController = self; } }


Termino con estas soluciones. A medida que tocamos el botón volver, aparece el método viewDidDisappear. podemos verificar llamando al selector isMovingFromParentViewController que devuelve true. podemos pasar datos de vuelta (usando Delegate). Espero que esto ayude a alguien.

-(void)viewDidDisappear:(BOOL)animated{ if (self.isMovingToParentViewController) { } if (self.isMovingFromParentViewController) { //moving back //pass to viewCollection delegate and update UI [self.delegateObject passBackSavedData:self.dataModel]; } }


es probable que sea mejor anular el botón de retroceso para que pueda manejar el evento antes de que aparezca la vista para cosas tales como la confirmación del usuario.

en viewDidLoad crea un UIBarButtonItem y establece self.navigationItem.leftBarButtonItem para que pase en un sel

- (void) viewDidLoad { // change the back button to cancel and add an event handler UIBarButtonItem *backButton = [[UIBarButtonItem alloc] initWithTitle:@”back” style:UIBarButtonItemStyleBordered target:self action:@selector(handleBack:)]; self.navigationItem.leftBarButtonItem = backButton; [backButton release]; } - (void) handleBack:(id)sender { // pop to root view controller [self.navigationController popToRootViewControllerAnimated:YES]; }

Luego puede hacer cosas como subir un UIAlertView para confirmar la acción, luego abrir el controlador de vista, etc.

O bien, en lugar de crear un nuevo botón, puede cumplir con los métodos de delegado UINavigationController para realizar acciones cuando se presiona el botón Atrás.