UINavigationBar botón de retroceso personalizado sin título

¿Cómo puedo personalizar el botón de navegación hacia atrás en iOS 7 y superior sin título? (es decir, solo con la flecha)

self.navigationItem.leftBarButtonItem = self.editButtonItem; 

Me pregunto si tienen algún self.backButtonItem;

O

¿algo como esto?

 self.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemBACK target:self action:@selector(back)]; 

En realidad es bastante fácil, esto es lo que hago:

C objective

 // Set this in every view controller so that the back button displays back instead of the root view controller name self.navigationItem.backBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"" style:UIBarButtonItemStylePlain target:nil action:nil]; 

Swift 2

 self.navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .Plain, target: nil, action: nil) 

Swift 3

 self.navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil) 

Coloque esta línea en el controlador de vista que está presionando sobre la stack ( el controlador de vista anterior ). El botón de retroceso del controlador de vista recién enviado ahora mostrará todo lo que pones para initWithTitle, que en este caso es una cadena vacía.

Encontré una manera fácil de hacer mi botón de retroceso con la flecha única de iOS.

Supongamos que tienes un controlador de navegación yendo a ViewA desde ViewB. En IB, seleccione la barra de navegación de ViewA, debería ver estas opciones: Título, Preguntar y Atrás.

Opciones de la barra de navegación ViewA

Opciones de la barra de navegación ViewA

El truco es elegir el título del botón Atrás del controlador de vista de destino (ViewB) en las opciones del controlador de vista anterior (Vista A). Si no completa la opción “Botón Atrás”, iOS colocará el título “Atrás” automáticamente, con el título del controlador de vista anterior . Por lo tanto, debe completar esta opción con un solo espacio.

Rellene el espacio en la opción “Botón Atrás”

Rellene el espacio en la opción

El resultado:

El resultado:

Solo usa una imagen!

OBJ-C :

 - (void)viewDidLoad { [super viewDidLoad]; UIBarButtonItem *backButton = [[UIBarButtonItem alloc] initWithImage:[UIImage imageNamed:@"Icon-Back"] style:UIBarButtonItemStylePlain target:self.navigationController action:@selector(popViewControllerAnimated:)]; self.navigationItem.leftBarButtonItem = backButton; } 

SWIFT 4 :

 let backBTN = UIBarButtonItem(image: UIImage(named: "Back"), style: .plain, target: navigationController, action: #selector(UINavigationController.popViewController(animated:))) navigationItem.leftBarButtonItem = backBTN navigationController?.interactivePopGestureRecognizer?.delegate = self 

Icon-Back.png

Icon-Back

Icon-Back@2x.png

Icon-Back @ 2x

Icon-Back@3x.png

Icon-Back @ 23x

iOS7 tiene nuevas reglas de interfaz, por lo que es mejor mantener al menos la flecha hacia atrás cuando presionas un UIView. Es muy fácil cambiar el texto “atrás” programáticamente. Simplemente agregue este código antes de presionar la vista (o prepareForSegue si está usando StoryBoards):

 -(void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{ self.navigationItem.backBarButtonItem=[[UIBarButtonItem alloc] initWithTitle:@"NEW TITLE" style:UIBarButtonItemStylePlain target:nil action:nil]; } 

Esto cambiará el texto “Atrás” predeterminado, pero mantendrá el iOS7 con la flecha hacia atrás. También puede cambiar el color del tinte para la flecha hacia atrás antes de presionar la vista:

 - (void)viewDidLoad{ //NavBar background color: self.navigationController.navigationBar.barTintColor=[UIColor redColor]; //NavBar tint color for elements: self.navigationController.navigationBar.tintColor=[UIColor whiteColor]; } 

¡Espero que esto te ayude!

No hay mucho que necesites hacer. Puedes lograr lo mismo a través del guión gráfico en sí mismo.

Simplemente ve al controlador de navegación raíz y dale un espacio. Recuerde no al controlador que deseaba el botón Atrás sin título, sino al controlador de navegación raíz.

Según la imagen a continuación. Esto funciona para iOS 7 e iOS 8

Si bien la respuesta de Kyle Begemn es totalmente lógica , es bastante molesto tener este código en cada controlador de vista posible. Terminé con una categoría simple UINavigationItem . ¡Cuidado, aquí hay dragones! Lo siento, quiero decir, swizzling:

 #import  @implementation UINavigationItem (ArrowBackButton) static char kArrowBackButtonKey; + (void)load { static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ Method m1 = class_getInstanceMethod(self, @selector(backBarButtonItem)); Method m2 = class_getInstanceMethod(self, @selector(arrowBackButton_backBarButtonItem)); method_exchangeImplementations(m1, m2); }); } - (UIBarButtonItem *)arrowBackButton_backBarButtonItem { UIBarButtonItem *item = [self arrowBackButton_backBarButtonItem]; if (item) { return item; } item = objc_getAssociatedObject(self, &kArrowBackButtonKey); if (!item) { item = [[UIBarButtonItem alloc] initWithTitle:@"" style:UIBarButtonItemStyleBordered target:nil action:NULL]; objc_setAssociatedObject(self, &kArrowBackButtonKey, item, OBJC_ASSOCIATION_RETAIN_NONATOMIC); } return item; } @end 

EDITAR: 2014-04-09: A medida que gané reputaciones, lo siento porque ya no uso este truco. Recomiendo la respuesta de Kyle. También self.navigationItem.backBarButtonItem cuenta que el self de self.navigationItem.backBarButtonItem no es el controlador de vista que se muestra el botón Atrás, pero que el controlador de vista anterior se volvió.

Si no necesita tener el texto del título para el controlador de vista anterior, simplemente complete el título con una cadena en blanco;

 self.navigationItem.title = @""; [self.navigationController pushViewController:viewController animated:YES]; 

Esto evitará mostrar “atrás” con chevron en el controlador de vista presionado.

EDITAR: incluso si usa texto de título en blanco, configurar el título del control de vista anterior en viewWillAppear: funciona, excepto que el título puede parpadear en un abrir y cerrar de viewWillAppear: controlador de vista. Creo que “La aplicación de Twitter” parece hacer un corte más sutil para evitar el parpadeo.

Esto funciona, pero eliminará el título del artículo anterior, incluso si vuelves a él:

 self.navigationController.navigationBar.topItem.title = @""; 

Simplemente configure esta propiedad en viewDidLoad del Controlador de Vista empujado.

Así es como lo hago y lo más simple, funciona y la manera más clara de hacerlo.

Esto funciona si se incrusta en el Navigation Controller

Swift 3

En viewDidLoad , agrego esto al controlador de vista que desea que el botón de retroceso sea solo una flecha.

 if let topItem = self.navigationController?.navigationBar.topItem { topItem.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil) } 

La diferencia de esto con la respuesta de @Kyle Begemn es que usted llama esto al controlador de vista que desea que el botón Atrás sea simplemente flecha, no en el controlador de vista astackr stack.

No tiene acceso al backButtonItem de navegación de la manera que desea, debe crear su propio botón de retroceso como se muestra a continuación:

 - (void)loadView { [super loadView]; UIButton *backButton = [[UIButton alloc] initWithFrame: CGRectMake(0, 0, 44.0f, 30.0f)]; [backButton setImage:[UIImage imageNamed:@"back.png"] forState:UIControlStateNormal]; [backButton addTarget:self action:@selector(popVC) forControlEvents:UIControlEventTouchUpInside]; self.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc] initWithCustomView:backButton]; } 

Y fuera del curso:

 - (void) popVC{ [self.navigationController popViewControllerAnimated:YES]; } 

El truco simple de iOS6 también funciona en iOS7:

 [UIBarButtonItem.appearance setBackButtonTitlePositionAdjustment:UIOffsetMake(0, -60) forBarMetrics:UIBarMetricsDefault]; 

Editar: No use este truco. Ver comentario para más detalles.

Objetivo: personalizar todo el botón UINavigationBar en UINavigationBar en un icono blanco

Pasos: 1. en el método “didFinishLaunchWithOptions” de AppDelete:

 UIImage *backBtnIcon = [UIImage imageNamed:@"navBackBtn"]; if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"7.0")) { [UINavigationBar appearance].tintColor = [UIColor whiteColor]; [UINavigationBar appearance].backIndicatorImage = backBtnIcon; [UINavigationBar appearance].backIndicatorTransitionMaskImage = backBtnIcon; }else{ UIImage *backButtonImage = [backBtnIcon resizableImageWithCapInsets:UIEdgeInsetsMake(0, backBtnIcon.size.width - 1, 0, 0)]; [[UIBarButtonItem appearance] setBackButtonBackgroundImage:backButtonImage forState:UIControlStateNormal barMetrics:UIBarMetricsDefault]; [[UIBarButtonItem appearance] setBackButtonTitlePositionAdjustment:UIOffsetMake(0, -backButtonImage.size.height*2) forBarMetrics:UIBarMetricsDefault]; } 

2. en el método viewDidLoad de la clase super ViewController común:

  if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"7.0")) { UIBarButtonItem *backItem = [[UIBarButtonItem alloc] initWithTitle:@"" style:UIBarButtonItemStylePlain target:nil action:nil]; [self.navigationItem setBackBarButtonItem:backItem]; }else{ //do nothing } 

puedes usar esto Esto funciona perfectamente para mí simplemente agregando un UIButton como una vista custum para UIBarButtonItem .

Pruebe el código a continuación

  self.navigationItem.leftBarButtonItem=[self backButton]; - (UIBarButtonItem *)backButton { UIImage *image = [UIImage imageNamed:@"back-btn.png"]; CGRect buttonFrame = CGRectMake(0, 0, image.size.width, image.size.height); UIButton *button = [[UIButton alloc] initWithFrame:buttonFrame]; [button addTarget:self action:@selector(backButtonPressed) forControlEvents:UIControlEventTouchUpInside]; [button setImage:image forState:UIControlStateNormal]; UIBarButtonItem *item= [[UIBarButtonItem alloc] initWithCustomView:button]; return item; } 

Todas las respuestas no resuelven el problema. No es aceptable volver atrás el título del botón en cada control de vista y agregar desplazamiento al título aún hace que el título del siguiente View Controller se desplace hacia la derecha.

Este es el método que usa el método swizzling, solo crea una nueva extensión para UINavigationItem

 import UIKit extension UINavigationItem { public override class func initialize() { struct Static { static var token: dispatch_once_t = 0 } // make sure this isn't a subclass if self !== UINavigationItem.self { return } dispatch_once(&Static.token) { let originalSelector = Selector("backBarButtonItem") let swizzledSelector = #selector(UINavigationItem.noTitleBackBarButtonItem) let originalMethod = class_getInstanceMethod(self, originalSelector) let swizzledMethod = class_getInstanceMethod(self, swizzledSelector) let didAddMethod = class_addMethod(self, originalSelector, method_getImplementation(swizzledMethod), method_getTypeEncoding(swizzledMethod)) if didAddMethod { class_replaceMethod(self, swizzledSelector, method_getImplementation(originalMethod), method_getTypeEncoding(originalMethod)) } else { method_exchangeImplementations(originalMethod, swizzledMethod) } } } // MARK: - Method Swizzling struct AssociatedKeys { static var ArrowBackButtonKey = "noTitleArrowBackButtonKey" } func noTitleBackBarButtonItem() -> UIBarButtonItem? { if let item = self.noTitleBackBarButtonItem() { return item } if let item = objc_getAssociatedObject(self, &AssociatedKeys.ArrowBackButtonKey) as? UIBarButtonItem { return item } else { let newItem = UIBarButtonItem(title: " ", style: UIBarButtonItemStyle.Plain, target: nil, action: nil) objc_setAssociatedObject(self, &AssociatedKeys.ArrowBackButtonKey, newItem as UIBarButtonItem?, .OBJC_ASSOCIATION_RETAIN_NONATOMIC) return newItem } } } 

Cree un UILabel con el título que desee para su controlador de vista raíz y UILabel a navigationItem.titleView del controlador de vista.

Ahora establece el título en una cadena vacía y el siguiente controlador de vista que presiones tendrá un botón Atrás sin texto.

 self.navigationItem.titleView = titleLabel; //Assuming you've created titleLabel above self.title = @""; 
  // add left bar button item try this code: - (void)viewDidLoad { [super viewDidLoad]; UIImage* image_back = [UIImage imageNamed:@"your_leftarrowImage.png"]; CGRect backframe = CGRectMake(250, 9, 15,21); UIButton *backbutton = [[UIButton alloc] initWithFrame:backframe]; [backbutton setBackgroundImage:image_back forState:UIControlStateNormal]; [backbutton addTarget:self action:@selector(Btn_back:) forControlEvents:UIControlEventTouchUpInside]; [backbutton setShowsTouchWhenHighlighted:YES]; UIBarButtonItem *backbarbutton =[[UIBarButtonItem alloc] initWithCustomView:backbutton]; self.navigationItem.leftBarButtonItem=backbarbutton; [backbutton release]; } -(IBAction)Btn_back:(id)sender { [self.navigationController popViewControllerAnimated:YES]; } 

Puede subclase UINavigationController, establecerse como el delegado y establecer backBarButtonItem en el método delegado navigationController:willShowViewController:animated:

 @interface Custom_NavigationController : UINavigationController  @end @implementation Custom_NavigationController - (void)viewDidLoad { [super viewDidLoad]; self.delegate = self; } #pragma mark - UINavigationControllerDelegate - (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated { viewController.navigationItem.backBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"" style:UIBarButtonItemStylePlain target:nil action:nil]; } @end 

Restablecer título vacío

 UIBarButtonItem *backButton = [[UIBarButtonItem alloc] initWithTitle:@"" style:UIBarButtonItemStyleDone target:self action:@selector(handleBack:)]; [backButton setTintColor:Color_WHITE]; [self.navigationItem setBackBarButtonItem:backButton]; 

Cambiar imagen posterior

  UIImage *backImg = [[UIImage imageNamed:@"ic_back_white"] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal]; [UINavigationBar appearance].backIndicatorImage = backImg; [UINavigationBar appearance].backIndicatorTransitionMaskImage = backImg; 

He estado usando esta solución desde iOS 5 más o menos sin ningún problema. Hice una función de utilidad que llamo en mis controladores de vista. Debe hacerlo en viewDidLoad o en cualquier otro punto posterior.

 void updateBackButtonTextForViewController(UIViewController *viewController, NSString *text) { if(! viewController.navigationItem.backBarButtonItem) { viewController.navigationItem.backBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:text style:UIBarButtonItemStylePlain target:nil action:nil]; } else { viewController.navigationItem.backBarButtonItem.title = text; } } 

En algunos casos, el elemento de navegación ya puede existir, en otros casos debe ser creado. Esto explica ambos casos sin interferir con el título del elemento de navegación. Le permite eliminar el título simplemente pasando @"" .

Apliqué el siguiente código en viewDidLoad y funciona:

  // this will set the back button title self.navigationController.navigationBar.topItem.title = @"Test"; // this line set the back button and default icon color //[[self.navigationController.navigationBar.subviews lastObject] setTintColor:[UIColor blackColor]]; this line change the back default icon to your custom icon [[self.navigationController.navigationBar.subviews lastObject] setTintColor:[UIColor colorWithPatternImage:[UIImage imageNamed:@"menuicon"]]]; 

Solo para actualizar utilizo Vector Icon

La única forma que funcionó para mí fue:

 navigationController?.navigationBar.backItem?.title = "" 

ACTUALIZAR:

Cuando cambié la bandera de animación segue a verdadera (antes era falsa), la única forma que funcionó para mí fue:

 navigationController?.navigationBar.topItem?.title = "" 

Si tiene dos ViewController (FirstVC, SecondVC) Incrustar en el Controlador de navegación, y desea que solo haya una flecha hacia atrás en SecondVC.

Puedes probar esto en ViewDidLoad de FirstVC

 override func viewDidLoad() { super.viewDidLoad() self.navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .Plain, target: nil, action: nil) } 

Luego, cuando ingresas a SecondVC, verás que solo hay una flecha hacia atrás

Si configura el tintColor Of NavigationBar, agregue una imagen de botón trasera personalizada sin título que reflejará el color de la imagen. Siga este enlace de documentación de Apple.

https://developer.apple.com/library/content/documentation/UserExperience/Conceptual/UIKitUICatalog/index.html#//apple_ref/doc/uid/TP40012857-UIView-SW7

 UINavigationItem *navItem = [[UINavigationItem alloc] init]; navBar.tintColor = self.tintColor; UIImage *myImage = [UIImage imageNamed:@"left_arrow.png"]; myImage = [myImage imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate]; UIBarButtonItem *leftButton = [[UIBarButtonItem alloc] initWithImage:myImage style:UIBarButtonItemStylePlain target:self action:@selector(cancelButtonFunction:)]; navItem.leftBarButtonItem = leftButton; navBar.items = @[ navItem ]; 

Mira esta respuesta

¿Cómo cambiar el nombre del botón Atrás del UINavigationController?

establecer el texto del title a la string con un espacio en blanco como a continuación

 title = " " 

No tienes suficiente reputación para agregar comentarios 🙂

En el método prepareForSegue de su primer ViewController establece ese título de vistas en @ “”, por lo que cuando se presiona la próxima vista, se mostrará el título ViewController anterior que será @ “”.

 -(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{ self.navigationItem.title = @" "; } 

El único problema con esto es que cuando presiona el botón Atrás su vista anterior no tendrá un título, por lo que puede agregarla nuevamente en viewWillAppear:

 -(void)viewWillAppear:(BOOL)animated{ self.navigationItem.title = @"First View Title"; } 

No me gusta mucho esta solución, pero funciona y no encontré otra manera de hacerlo.

Para agregar a la respuesta anterior de Thomas C , a veces poner un solo espacio no funciona y debes seguir agregando espacios.

botón de barra vacía

Sabrá que tuvo éxito cuando vea “Elemento del botón de barra -” debajo del “Elemento de navegación”. Eso está en el contorno del documento (Editor-> Mostrar contorno del documento). Una vez que vea la imagen de arriba, puede eliminar algunos espacios y ver si todavía funciona.

 - (id)initWithCoder:(NSCoder *)aDecoder { self = [super initWithCoder:aDecoder]; if (self) { // Custom initialization self.navigationItem.backBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"" style:UIBarButtonItemStylePlain target:nil action:nil]; } return self; } 

Al igual que Kyle Begemn, agrega el código anterior en su controlador de vista raíz. Se aplicará todo el controlador de vista secundaria. Además, al agregar esto en el método initWithCoder, puede aplicar el estilo para los controladores de vista raíz en xib, storyboard o enfoques basados ​​en código.

  1. Agregar nuevo UIBarButtonItem a UINavigationItem a la izquierda
  2. Cambiar UIBarButtonItem cómo querer usar
  3. Ahora, haz clic en UINavigationItem y desliza barBackButtonItem desde las tomas hacia la izquierda UIBarButtonItem

enter image description here

Puede colocar esa categoría en el archivo AppDelegate.m. para eliminar texto de todos los botones de retroceso predeterminados en UINavigation. Solo la flecha “< " o establezca una imagen personalizada si lo necesita.

C objective:

@fin

  @implementation UINavigationItem (Extension)

 - (UIBarButtonItem *) backBarButtonItem {

     return [[UIBarButtonItem alloc] initWithTitle: @ "" style: UIBarButtonItemStylePlain target: nil action: nil];
 }

 @fin 

Establecer el título del elemento del botón como cadena vacía.

[self.navigationController.navigationBar.backItem setTitle: @ “”];