2012-01-23 17 views

Respuesta

15

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

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

+5

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

+3

no funciona –

1

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

+0

que el método será llamado cuando vc que aparece en absoluto, no necesariamente sólo como resultado de simplemente volver a ella – Colin

+1

@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. –

6
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]; 
} 
+0

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+ –

+0

Esto no está funcionando con self.navigationItem.rightBarButtonItem ... Por favor, dé otra solución – Vidhi

6

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; 
    } 
} 
Cuestiones relacionadas