UINavigationBar Ocultar texto del botón Atrás

¿Cómo puedo ocultar el texto del botón Atrás desde un controlador UINavigation? Solo tendré el “<" y no "<Atrás"

En el generador de interfaz , puede seleccionar el elemento de navegación del controlador anterior y cambiar la cadena del Back Button a la que desea que aparezca el botón Atrás. Si lo quiere en blanco, por ejemplo, solo ponga un espacio.

También puede cambiarlo con esta línea de código:

[self.navigationItem.backBarButtonItem setTitle:@"Title here"];

O en Swift :

self.navigationItem.backBarButtonItem?.title = ""

También puedes hacer esto a través del guión gráfico. En el inspector de atributos del elemento de navegación del controlador anterior , puede establecer “” en el campo del botón Atrás. Consulte la imagen a continuación. Reemplace “Su título aquí” en “”. Al hacer esto, logrará el resultado deseado. Ya no es necesario que te metas con el ‘Título’.

Programáticamente podrías usar

[self.navigationItem.backBarButtonItem setTitle:@" "];

donde self se refiere al controlador que empuja su controlador View deseado.

Elemento de navegación del controlador de vista Xcode

Muestra antes, después de la barra de navegación

antes de antes de

Después Después

Puede implementar UINavigationControllerDelegate de esta manera:

 func navigationController(navigationController: UINavigationController, willShowViewController viewController: UIViewController, animated: Bool) { let item = UIBarButtonItem(title: " ", style: .Plain, target: nil, action: nil) viewController.navigationItem.backBarButtonItem = item } 

backBarButtonItem es nulo por defecto y afecta al siguiente controlador empujado, por lo que solo lo configura para todos los controladores

Otra solución a este problema para situaciones en las que tiene una gran cantidad de controladores de vista es usar un proxy UIAppearance para ocultar efectivamente el texto del título del botón de retroceso de esta manera:

 UIBarButtonItem *navBarButtonAppearance = [UIBarButtonItem appearanceWhenContainedIn:[UINavigationBar class], nil]; [navBarButtonAppearance setTitleTextAttributes:@{ NSFontAttributeName: [UIFont systemFontOfSize:0.1], NSForegroundColorAttributeName: [UIColor clearColor] } forState:UIControlStateNormal]; 

Esta solución representará el texto como un pequeño punto claro, similar al ajuste manual del título del botón Atrás a @" " , excepto que afecta a todos los botones de la barra de navegación.

No sugiero esto como una solución general al problema porque afecta a todos los botones de la barra de navegación. Cambia el paradigma para que pueda elegir cuándo mostrar los títulos de los botones, en lugar de cuándo ocultar los títulos.

Para elegir cuándo mostrar los títulos, restaure manualmente los atributos del texto del título según sea necesario o cree una subclase especializada de UIBarButtonItem que haga lo mismo (potencialmente con otro proxy UIAppearance ).

Si tiene una aplicación donde la mayoría de los títulos de los botones de retroceso necesitan estar ocultos, y solo unos pocos (o ninguno) de los botones de navegación son botones del sistema con títulos, ¡esto podría ser para usted!

(Nota: el cambio de tamaño de fuente es necesario aunque el color del texto sea claro para garantizar que los títulos largos no causen que el título de la barra de navegación del centro cambie)

Agregue el siguiente código en viewDidLoad o loadView

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

Lo probé en iPhone y iPad con iOS 9

Establecer el título del botón Atrás en @"" o nil no funcionará. Debe configurar el botón completo en blanco (sin título ni imagen):

C objective

[self.navigationItem setBackBarButtonItem:[[UIBarButtonItem alloc] initWithTitle:@"" style:UIBarButtonItemStylePlain target:nil action:nil]];

Rápido

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

Esto debe hacerse en el controlador de vista que se encuentra encima de su controlador de vista en la stack de navegación (es decir, desde donde navega a su VC mediante el método pushViewController )

Puede agregar esta categoría Objective-C para que todos los botones “Atrás” creados por un controlador de navegación no tengan texto. Acabo de agregarlo a mi archivo AppDelegate.m.

 @implementation UINavigationItem (Customization) /** Removes text from all default back buttons so only the arrow or custom image shows up. */ -(UIBarButtonItem *)backBarButtonItem { return [[UIBarButtonItem alloc] initWithTitle:@"" style:UIBarButtonItemStylePlain target:nil action:nil]; } @end 

PD: (No sé cómo hacer que esta extensión funcione con Swift, estaba teniendo errores extraños. Las ediciones son bienvenidas para agregar una versión de Swift)

para eliminar el texto del botón de retroceso programáticamente, usado debajo del código, esto funcionará desde xcode7 y superior.

self.navigationController.navigationBar.topItem.title = @ “”;

o

manualLlame en los guiones gráficos, seleccione la barra de navegación en el controlador de vista y ponga “” en el texto del botón de retroceso.

esto funcionará Gracias

Lo único que funciona sin efectos secundarios es crear un botón de retroceso personalizado. Siempre que no proporcione una acción personalizada, incluso el gesto de deslizamiento funciona.

 extension UIViewController { func setupBackButton() { let customBackButton = UIBarButtonItem(title: " ", style: .plain, target: nil, action: nil) navigationItem.backBarButtonItem = customBackButton }} 

Desafortunadamente, si desea que todos los botones de retroceso no tengan ningún título, debe configurar este botón de retroceso personalizado en todos sus controles de vista: /

 override func viewDidLoad() { super.viewDidLoad() setupBackButton() } 

Es muy importante que establezca un espacio en blanco como título y no como cadena vacía.

La respuesta actual no estaba funcionando. Quería eliminar el título por completo, pero el texto “atrás” no desaparecía.

Regrese al controlador de vista anterior y establezca su propiedad de título:

 self.title = @" "; 

SOLAMENTE funciona cuando el controlador de vista anterior no tiene un título

Establezca el Título del CV anterior en “” cadena con espacio. y el título con el botón Atrás será reemplazado por una cadena de espacio único.

 Self.title = " " 

Al pulsar Atrás, vuelva a restablecer el título al original en la vista Aparecerá.

En Swift3,

Si establece una configuración global

 func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { // .. let BarButtonItemAppearance = UIBarButtonItem.appearance() BarButtonItemAppearance.setTitleTextAttributes([NSForegroundColorAttributeName: UIColor.clear], for: .normal) BarButtonItemAppearance.setTitleTextAttributes([NSForegroundColorAttributeName: UIColor.clear], for: .highlighted) // ... } 

Intenté todo en esta publicación. La única solución de trabajo es @ VoidLess’s

Aquí está la misma respuesta pero más completa

 class CustomNavigationController: UINavigationController { override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) self.delegate = self } } // MARK:UINavigationControllerDelegate extension CustomNavigationController { func navigationController(_ navigationController: UINavigationController, willShow viewController: UIViewController, animated: Bool) { viewController.navigationItem.backBarButtonItem = UIBarButtonItem(title: " ", style: .plain, target: nil, action: nil) } } 

Use un NavigationController personalizado que anule pushViewController

 class NavigationController: UINavigationController { override func pushViewController(_ viewController: UIViewController, animated: Bool) { viewController.navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil) super.pushViewController(viewController, animated: animated) } } 

Manera alternativa: use la clase Custom NavigationBar.

 class NavigationBar: UINavigationBar { var hideBackItem = true private let emptyTitle = "" override func layoutSubviews() { if let `topItem` = topItem, topItem.backBarButtonItem?.title != emptyTitle, hideBackItem { topItem.backBarButtonItem = UIBarButtonItem(title: emptyTitle, style: .plain, target: nil, action: nil) } super.layoutSubviews() } } 

Es decir, esto quita todo el proyecto de títulos. Simplemente configure la clase personalizada para UINavigationController.

Swift 3.1 Puede hacerlo implementando el método delegado de UINavigationController.

 func navigationController(_ navigationController: UINavigationController, willShow viewController: UIViewController, animated: Bool) { /** It'll hide the Title with back button only, ** we'll still get the back arrow image and default functionality. */ let item = UIBarButtonItem(title: " ", style: .plain, target: nil, action: nil) viewController.navigationItem.backBarButtonItem = item } 

Para aquellos que quieren ocultar el título del botón Atrás globalmente.

Puede swizzle viewDidLoad de UIViewController esta manera.

 + (void)overrideBackButtonTitle { NSError *error; // I use `Aspects` for easier swizzling. [UIViewController aspect_hookSelector:@selector(viewDidLoad) withOptions:AspectPositionBefore usingBlock:^(id aspectInfo) { UIViewController *vc = (UIViewController *)aspectInfo.instance; // Check whether this class is my app's view controller or not. // We don't want to override this for Apple's view controllers, // or view controllers from external framework. NSString *className = NSStringFromClass([vc class]); Class class = [NSBundle.mainBundle classNamed:className]; if (!class) { return; } UIBarButtonItem *backButton = [[UIBarButtonItem alloc] initWithTitle:@" " style:UIBarButtonItemStylePlain target:nil action:nil]; vc.navigationItem.backBarButtonItem = backButton; } error:&error]; if (error) { NSLog(@"%s error: %@", __FUNCTION__, error.localizedDescription); } } 

Uso:

 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { [[self class] overrideBackButtonTitle]; return YES; } 

En iOS 11, descubrimos que al establecer la fuente / color de texto de la apariencia UIBarButtonItem en un valor muy pequeño o en un color claro, desaparecerá otro elemento de la barra (el sistema ya no respeta la clase del elemento UIBarButton, sino que lo convertirá en _UIModernBarButton ). También establecer el desplazamiento del texto inverso a fuera de pantalla dará como resultado el flash durante el pop interactivo.

Así que volcamos addSubView :

 + (void)load { if (@available(iOS 11, *)) { [NSClassFromString(@"_UIBackButtonContainerView") jr_swizzleMethod:@selector(addSubview:) withMethod:@selector(MyiOS11BackButtonNoTextTrick_addSubview:) error:nil]; } } - (void)MyiOS11BackButtonNoTextTrick_addSubview:(UIView *)view { view.alpha = 0; if ([view isKindOfClass:[UIButton class]]) { UIButton *button = (id)view; [button setTitle:@" " forState:UIControlStateNormal]; } [self MyiOS11BackButtonNoTextTrick_addSubview:view]; } 

Esta es mi resolución para iOS11, cambio la apariencia de UIBarButtonItem en applicationDidFinishLaunchingWithOptions:

 UIBarButtonItem.appearance().setBackButtonTitlePositionAdjustment(UIOffsetMake(-100, 0), for:UIBarMetrics.default) 

No puede cambiar el desplazamiento Y, porque también cambiará la posición del botón de la barra trasera en iOS11, pero está bien en iOS10 y versiones posteriores.

Finalmente encontré la solución perfecta para ocultar el texto por defecto en toda la aplicación.

Simplemente agregue una imagen transparente y agregue el siguiente código en su AppDelegate.

 UIBarButtonItem.appearance().setBackButtonBackgroundImage(#imageLiteral(resourceName: "transparent"), for: .normal, barMetrics: .default) 

Estaba luchando con esto porque tenía un controlador de navegación personalizado. Pude eliminar el texto del elemento posterior en todos los controladores de vista con este código en mi clase de controlador de navegación personalizada override func viewDidLayoutSubviews() { self.navigationBar.backItem?.title = "" }

Esto elimina todos los títulos de elementos posteriores con este controlador de navegación personalizado.

 -(void)setNavigationItems{ UIBarButtonItem *leftBarButtonItem=[[UIBarButtonItem alloc]initWithTitle:@"**Your title here**" style:UIBarButtonItemStyleBordered target:self action:@selector(backButtonClicked)]; self.navigationController.navigationBar.topItem.backBarButtonItem=leftBarButtonItem; } -(void)backButtonClicked{ [self.navigationController popViewControllerAnimated:YES]; } 

Ya hay muchas respuestas, aquí están mis dos centavos sobre el tema. Encontré este enfoque realmente robusto. Solo tiene que poner esto en viewController antes de segue.

Swift 4:

 override func prepare(for segue: UIStoryboardSegue, sender: Any?) { navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil) } 

El siguiente método funciona en iOS 11 y es seguro no bloquear en otras versiones de iOS. Hacer esto puede hacer que se rechace tu aplicación en la revisión de la App Store, ya que tanto UIModernBarButton como UIBackButtonContainerView son API privadas. Colocar en AppDelegate.

  if let UIModernBarButton = NSClassFromString("_UIModernBarButton") as? UIButton.Type, let UIBackButtonContainerView = NSClassFromString("_UIBackButtonContainerView") as? UIView.Type { let backButton = UIModernBarButton.appearance(whenContainedInInstancesOf: [UIBackButtonContainerView.self]) backButton.setTitleColor(.clear, for: .normal) } 

La versión Swift, funciona a la perfección en todo el mundo:

  func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { UIBarButtonItem.appearance().setTitleTextAttributes([NSForegroundColorAttributeName:UIColor.clearColor()], forState: UIControlState.Normal) UIBarButtonItem.appearance().setTitleTextAttributes([NSForegroundColorAttributeName:UIColor.clearColor()], forState: UIControlState.Highlighted) return true } 

Esto es de mi código xamarin.forms, la clase se deriva de NavigationRenderer

 NavigationBar.Items.FirstOrDefault().BackBarButtonItem = new UIBarButtonItem( "", UIBarButtonItemStyle.Plain, null);