item guidelines color bar ios uinavigationcontroller uinavigationbar selector

ios - guidelines - navigation item



Intentando manejar la acción del botón de navegación "atrás" en iOS (7)

Rápido

override func didMoveToParentViewController(parent: UIViewController?) { if parent == nil { //"Back pressed" } }

Necesito detectar cuándo el usuario toca el botón "Atrás" en la barra de navegación, para realizar algunas operaciones cuando eso ocurre. Estoy tratando de configurar manualmente una acción para dicho botón, de esta manera:

[self.navigationItem.backBarButtonItem setAction:@selector(performBackNavigation:)]; - (void)performBackNavigation:(id)sender { // Do operations [self.navigationController popViewControllerAnimated:NO]; }

Primero coloqué ese código en el controlador de vista, pero encontré que self.navigationItem.backBarButtonItem parecía ser nil , así que moví el mismo código al controlador de vista padre, que empuja al primero a la pila de navegación. Pero tampoco puedo hacerlo funcionar. He leído algunas publicaciones sobre este tema, y ​​algunas dijeron que el selector debe establecerse en el controlador de vista principal, pero para mí no funciona de todos modos ... ¿Qué podría estar haciendo mal?

Gracias


El problema con didMoveToParentViewController es que se llama una vez que la vista padre es completamente visible nuevamente, por lo que si necesita realizar algunas tareas antes de eso, no funcionará.

Y no funciona con el gesto de animación impulsado. El uso de willMoveToParentViewController funciona mejor.

C objetivo

- (void)willMoveToParentViewController:(UIViewController *)parent{ if (parent == NULL) { // ... } }

Rápido

override func willMoveToParentViewController(parent: UIViewController?) { if parent == nil { // ... } }


Esta es la versión de Objective-C de Respuesta de :

C objetivo

- (void)didMoveToParentViewController:(UIViewController *)parent{ if (parent == NULL) { NSLog(@"Back Pressed"); } }


Establezca UINavigationControllerDelegate e implemente este delegado func (Swift):

func navigationController(navigationController: UINavigationController, willShowViewController viewController: UIViewController, animated: Bool) { if viewController is <target class> { //if the only way to get back - back button was pressed } }


Establezca el delegado de UINavigationBar y luego use:

- (BOOL)navigationBar:(UINavigationBar *)navigationBar shouldPopItem:(UINavigationItem *)item { //handle the action here }


Pruebe este código utilizando el método VIewWillDisappear para detectar la pulsación del botón Atrás de NavigationItem:

-(void) viewWillDisappear:(BOOL)animated { if ([self.navigationController.viewControllers indexOfObject:self]==NSNotFound) { // Navigation button was pressed. Do some stuff [self.navigationController popViewControllerAnimated:NO]; } [super viewWillDisappear:animated]; }

O bien, hay otra forma de obtener la Acción del botón de BAck de navegación.

Crear botón personalizado para UINavigationItem del botón Atrás.

Por ejemplo:

En ViewDidLoad:

- (void)viewDidLoad { [super viewDidLoad]; UIBarButtonItem *newBackButton = [[UIBarButtonItem alloc] initWithTitle:@"Home" style:UIBarButtonItemStyleBordered target:self action:@selector(home:)]; self.navigationItem.leftBarButtonItem=newBackButton; } -(void)home:(UIBarButtonItem *)sender { [self.navigationController popToRootViewControllerAnimated:YES]; }

Swift:

override func willMoveToParentViewController(parent: UIViewController?) { if parent == nil { // Back btn Event handler } }


Tal vez esta respuesta no se ajuste a tu explicación, sino al título de la pregunta. Es útil cuando intenta saber cuándo pulsó el botón Atrás en una UINavigationBar .

En este caso, puede usar el protocolo UINavigationBarDelegate e implementar uno de estos métodos:

- (BOOL)navigationBar:(UINavigationBar *)navigationBar shouldPopItem:(UINavigationItem *)item; - (void)navigationBar:(UINavigationBar *)navigationBar didPopItem:(UINavigationItem *)item;

Cuando se didPopItem método didPopItem , se debe a que pulsaste el botón Atrás o [UINavigationBar popNavigationItemAnimated:] método [UINavigationBar popNavigationItemAnimated:] y la barra de navegación [UINavigationBar popNavigationItemAnimated:] el elemento.

Ahora, si quiere saber qué acción desencadenó el método didPopItem puede usar un indicador.

Con este enfoque, no es necesario agregar manualmente un elemento del botón de la barra izquierda con una imagen de flecha para que sea similar al botón Atrás de iOS, y poder establecer mi objetivo / acción personalizada.

Veamos un ejemplo:

Tengo un controlador de vista que tiene un controlador de vista de página y una vista de indicador de página personalizada. También estoy usando una UINavigationBar personalizada para mostrar un título para saber en qué página estoy y el botón Atrás para volver a la página anterior. Y también puedo deslizarme a la página anterior / siguiente en el controlador de página.

#pragma mark - UIPageViewController Delegate Methods - (void)pageViewController:(UIPageViewController *)pageViewController didFinishAnimating:(BOOL)finished previousViewControllers:(NSArray *)previousViewControllers transitionCompleted:(BOOL)completed { if( completed ) { //... if( currentIndex > lastIndex ) { UINavigationItem *navigationItem = [[UINavigationItem alloc] initWithTitle:@"Some page title"]; [[_someViewController navigationBar] pushNavigationItem:navigationItem animated:YES]; [[_someViewController pageControl] setCurrentPage:currentIndex]; } else { _autoPop = YES; //We pop the item automatically from code. [[_someViewController navigationBar] popNavigationItemAnimated:YES]; [[_someViewController pageControl] setCurrentPage:currentIndex]; } } }

Entonces implemento los métodos de delegado UINavigationBar:

#pragma mark - UINavigationBar Delegate Methods - (BOOL)navigationBar:(UINavigationBar *)navigationBar shouldPopItem:(UINavigationItem *)item { if( !_autoPop ) { //Pop by back button tap } else { //Pop from code } _autoPop = NO; return YES; }

En este caso, utilicé shouldPopItem porque el pop está animado y quería manejar el botón Atrás inmediatamente y no esperar hasta que haya finalizado la transición.