Una opción sería implementar su propio botón de retroceso personalizado. Debería agregar el siguiente código a su método viewDidLoad:
- (void) viewDidLoad {
[super viewDidLoad];
self.navigationItem.hidesBackButton = YES;
UIBarButtonItem *newBackButton = [[UIBarButtonItem alloc] initWithTitle:@"Back" style:UIBarButtonItemStyleBordered target:self action:@selector(back:)];
self.navigationItem.leftBarButtonItem = newBackButton;
}
- (void) back:(UIBarButtonItem *)sender {
// Perform your custom actions
// ...
// Go back to the previous ViewController
[self.navigationController popViewControllerAnimated:YES];
}
ACTUALIZAR:
Aquí está la versión para Swift:
override func viewDidLoad {
super.viewDidLoad()
self.navigationItem.hidesBackButton = true
let newBackButton = UIBarButtonItem(title: "Back", style: UIBarButtonItemStyle.Bordered, target: self, action: "back:")
self.navigationItem.leftBarButtonItem = newBackButton
}
func back(sender: UIBarButtonItem) {
// Perform your custom actions
// ...
// Go back to the previous ViewController
self.navigationController?.popViewControllerAnimated(true)
}
ACTUALIZACIÓN 2:
Aquí está la versión para Swift 3:
override func viewDidLoad {
super.viewDidLoad()
self.navigationItem.hidesBackButton = true
let newBackButton = UIBarButtonItem(title: "Back", style: UIBarButtonItemStyle.plain, target: self, action: #selector(YourViewController.back(sender:)))
self.navigationItem.leftBarButtonItem = newBackButton
}
func back(sender: UIBarButtonItem) {
// Perform your custom actions
// ...
// Go back to the previous ViewController
_ = navigationController?.popViewController(animated: true)
}
Reemplazar el botón por uno personalizado como se sugiere en otra respuesta posiblemente no sea una gran idea, ya que perderá el comportamiento y el estilo predeterminados.
Otra opción que tiene es implementar el método viewWillDisappear en el controlador de vista y buscar una propiedad llamada isMovingFromParentViewController . Si esa propiedad es verdadera, significa que el controlador de vista está desapareciendo porque se está eliminando (haciendo estallar).
Debería verse algo así como:
En swift 4.2
fuente
override func viewWillDisappear(_ animated: Bool) { super.viewWillDisappear(animated) if isMovingFromParentViewController { // Your code... } }
viewWillDisappear(animated:)
se activará si recibe una llamada telefónica. Es probable que esto no sea lo que quieres. Probablemente mejor usarwillMove(toParentViewController:)
fuente
parent == nil
es cuando nos estamos moviendo hacia atrás a laparent
escenaPude lograr esto con lo siguiente:
Swift 3
Swift 4
No es necesario un botón de retroceso personalizado.
fuente
Creé esta clase (rápida) para crear un botón de retroceso exactamente como el normal, incluida la flecha de retroceso. Puede crear un botón con texto normal o con una imagen.
Uso
CustomBackButtonClass
(código para dibujar la flecha hacia atrás creada con el plugin Sketch & Paintcode)
SWIFT 3.0
fuente
Si desea tener el botón de retroceso con la flecha de retroceso, puede usar una imagen y un código a continuación
backArrow.png [email protected] [email protected]
fuente
Si está utilizando
navigationController
, agregue elUINavigationControllerDelegate
protocolo a la clase y agregue el método delegado de la siguiente manera:Este método se llama siempre que el controlador de navegación se deslice a una nueva pantalla. Si se presionó el botón Atrás, el nuevo controlador de vista es él
ViewController
mismo.fuente
En Swift 5 y Xcode 10.2
No agregue un elemento de botón de barra personalizado, use este comportamiento predeterminado.
Sin necesidad de viewWillDisappear , sin necesidad de BarButtonItem personalizado, etc.
Es mejor detectar cuándo se elimina el VC de su padre.
Use cualquiera de estas dos funciones
Si desea detener el comportamiento predeterminado del botón Atrás, agregue BarButtonItem personalizado.
fuente
NO
override func willMove(toParentViewController parent: UIViewController?) { }
Esto se llamará incluso si usted está segueing para el controlador de vista en el que está sustituyendo este método. En el que verificar si el "
parent
" es onil
no no es una forma precisa de asegurarse de volver a la correctaUIViewController
. Para determinar exactamente siUINavigationController
está navegando correctamente de regreso alUIViewController
que presentó este actual, deberá cumplir con elUINavigationControllerDelegate
protocolo.SI
nota:
MyViewController
es solo el nombre de loUIViewController
que quiera detectar al regresar.1) En la parte superior de su archivo agregue
UINavigationControllerDelegate
.2) Agregue una propiedad a su clase que hará un seguimiento de la
UIViewController
que está siguiendo.3) en
MyViewController
elviewDidLoad
método de asignarself
como delegado para suUINavigationController
.3) Antes de seguir , asigne el anterior
UIViewController
como esta propiedad.4) y se ajustan a un método en el
MyViewController
de laUINavigationControllerDelegate
fuente
En mi caso,
viewWillDisappear
funcionó mejor. Pero en algunos casos uno tiene que modificar el controlador de vista anterior. Así que aquí está mi solución con acceso al controlador de vista anterior y funciona en Swift 4 :fuente
Antes de dejar el controlador actual, necesito mostrar alerta. Entonces lo hice de esta manera:
UINavigationController
conUINavigationBarDelegate
Ha funcionado)
fuente
No es difícil como nosotros. Simplemente cree un marco para UIButton con un color de fondo claro, asigne acción para el botón y colóquelo sobre el botón Atrás de la barra de navegación. Y finalmente quite el botón después de usarlo.
Aquí está el código de muestra Swift 3 hecho con UIImage en lugar de UIButton
escribir el código necesita ser ejecutado
Elimine la subvista después de realizar la acción.
fuente
Swift 4.2:
fuente
Swift 3:
fuente
Prueba esto .
Prueba esto también.
fuente
solo haz control + arrastra el elemento de la barra a la función debajo. trabajar como encanto
fuente
Puedes subclasificar
UINavigationController
y anularpopViewController(animated: Bool)
. Además de poder ejecutar algún código allí, también puede evitar que el usuario regrese por completo, por ejemplo, para solicitar que guarde o descarte su trabajo actual.Implementación de muestra en la que puede establecer una
popHandler
que se establece / borra por controladores empujados.Y muestra el uso de un controlador push que rastrea el trabajo no guardado
Como un toque agradable, esto también se llamará
interactivePopGestureRecognizer
cuando el usuario intente regresar con un gesto de deslizar.fuente
Esta es mi solucion
En su controlador de vista, puede manejar así:
fuente
Como entiendo que desea vaciar su
array
medida que presiona el botón de retroceso y el pop a su anteriorViewController let
suArray
cual cargó en esta pantalla esfuente
fuente
fuente
Para Swift 5 , podemos comprobar que desaparecerá.
fuente
Swift 5 __ Xcode 11.5
En mi caso, quería hacer una animación, y cuando terminó, regresar. Una forma de sobrescribir la acción predeterminada del botón Atrás y llamar a su acción personalizada es esta:
O puede usar este método una vez para explorar la jerarquía de la vista NavigationBar y obtener los índices para acceder a la vista _UIButtonBarButton, enviar a UIControl, eliminar la acción de destino y agregar sus acciones de destino personalizadas:
fuente
Logré esto llamando / anulando
viewWillDisappear
y luego accediendo a la pila denavigationController
esta manera:fuente
Así es como lo resolví para mi propio problema.
fuente
Aquí está la solución Swift 5 más simple que no requiere que crees un botón de retroceso personalizado y renuncies a toda la funcionalidad del botón izquierdo de UINavigationController que obtienes de forma gratuita.
Como Brandon A recomienda anteriormente, debe implementar
UINavigationControllerDelegate
en el controlador de vista con el que desea interactuar antes de volver a él. Una buena manera es crear una secuencia de desconexión que pueda realizar de forma manual o automática y reutilizar el mismo código desde un botón personalizado o el botón Atrás.Primero, haga que su controlador de vista de interés (el que desea detectar que regrese) sea un delegado del controlador de navegación en su
viewDidLoad
:En segundo lugar, agregue una extensión en la parte inferior del archivo que anule
navigationController(willShow:animated:)
Como su pregunta incluía una
UITableViewController
, incluí una forma de obtener la ruta del índice de la fila que el usuario hizo tapping.fuente
Puedes hacer algo en tu Viewcontroller como
Para obtener una respuesta completa, use Detectar cuando se presiona el botón 'atrás' en una barra de navegación
fuente