guidelines - Eliminando el texto del título de un UIBarButtonItem de iOS
navigation bar swift 4 (30)
Ocultar el botón Atrás Título de la barra de navegación
UIBarButtonItem *barButton = [[UIBarButtonItem alloc] init];
barButton.title = @""; // blank or any other title
self.navigationController.navigationBar.topItem.backBarButtonItem = barButton;
Lo que quería hacer era eliminar el texto del botón "Atrás" de un UIBarButtonItem
, dejando solo el chevron azul en la barra de navegación. Tenga en cuenta que estoy desarrollando para iOS 7. He intentado varios métodos, que incluyen, entre otros:
Este es el método de imagen que no me gustó (la imagen se veía fuera de lugar):
UIBarButtonItem *barBtnItem = [[UIBarButtonItem alloc]initWithImage:[UIImage imageNamed:@"iOS7BackButton"] style:UIBarButtonItemStylePlain target:self action:@selector(goToPrevious:)];
self.navigationItem.leftBarButtonItem = barBtnItem;
Otro método que probé fue este, que simplemente no funcionó (no se mostró nada):
UIBarButtonItem *barBtn = [[UIBarButtonItem alloc]init];
barBtn.title=@"";
self.navigationItem.leftBarButtonItem=barBtn;
Lo que quería lograr es algo así como los botones de retroceso que se encuentran en la aplicación iOS 7 Music, que solo incluía un chevron.
Gracias.
Creo una clase personalizada para UINavigationController
y la aplico a todos los controladores de navegación en mi aplicación. Dentro de esta clase de UINavigationController
personalizada, configuro el delegado de UINavigationBar
a self
una vez que se carga la vista.
- (void)viewDidLoad {
self.navigationBar.delegate = self;
}
Luego implemento el método delegado:
- (BOOL)navigationBar:(UINavigationBar *)navigationBar shouldPushItem:(UINavigationItem *)item {
// This will clear the title of the previous view controller
// so the back button is always just a back chevron without a title
if (self.viewControllers.count > 1) {
UIViewController *previousViewController = [self.viewControllers objectAtIndex:(self.viewControllers.count - 2)];
previousViewController.title = @"";
}
return YES;
}
De esta manera, simplemente asigno mi clase personalizada a todos mis controladores de navegación y borra el título de todos los botones de atrás. Y para mayor claridad, siempre configuro el título para todos mis otros controladores de vista dentro de viewWillAppear
para que el título se actualice siempre justo antes de que aparezca la vista (en caso de que se elimine con trucos como este).
Cuando configure el título del botón, use @ "" en lugar de @ "".
--EDITAR--
¿Algo cambia cuando intentas otras cuerdas? Estoy usando el siguiente código con éxito:
UIBarButtonItem *backButton = [[UIBarButtonItem alloc] initWithTitle:backString style:UIBarButtonItemStyleDone target:nil action:nil];
[[self navigationItem] setBackBarButtonItem:backButton];
backString es una variable que se establece en @ "" o @ "Back", dependiendo de si estoy en iOS 7 o una versión inferior.
Una cosa a tener en cuenta es que este código no está en el controlador de la página para la que quiero personalizar el botón Atrás. En realidad está en el controlador antes que en la pila de navegación.
En el método prepareForSegue: de su primer ViewController, establece el título de las vistas en @ "", por lo que cuando se presione la siguiente vista, se mostrará el título anterior de ViewController que será @ "".
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{
self.navigationItem.title = @" ";
}
El único problema con esto es que cuando presionas el botón Atrás, tu vista anterior no tendrá un título, por lo que puedes agregarlo 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 forma de hacerlo.
En iOS7, Apple introdujo dos nuevas propiedades en UINavigationBar, ''backIndicatorTransitionMaskImage'' y ''backIndicatorImage''.
Simplemente llamando una vez:
[[UINavigationBar appearance] setBackIndicatorImage:[UIImage imageNamed:@"your_image"]];
[[UINavigationBar appearance] setBackIndicatorTransitionMaskImage:[UIImage imageNamed:@"your_image_mask"]];
Renderizará una imagen personalizada en lugar del glifo de galón predeterminado, heredando el color de tinte de la ventana clave.
Y para quitar el título, sugeriré la respuesta de Kamaros. Recuerde llamar a este código en el controlador de vista que está presionando su nuevo controlador de vista. Eliminando el texto del título de un UIBarButtonItem de iOS
En realidad, puedes hacer esto con un solo truco:
Sobrescriba la clase UINavigationBar
y agregue esta línea de código:
- (void)layoutSubviews{
self.backItem.title = @"";
[super layoutSubviews];
}
Luego inicialice su UINavigationController
con esta clase personalizada de UINavigationBar ... etc. UINavigationController * navController = [[UINavigationController alloc] initWithNavigationBarClass:[CBCNavigationBar class] toolbarClass:nil];
Espero que esto ayude
Esta es la mejor solución.
Otra solución es peligrosa porque es hackear.
extension UINavigationController {
func pushViewControllerWithoutBackButtonTitle(_ viewController: UIViewController, animated: Bool = true) {
viewControllers.last?.navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)
pushViewController(viewController, animated: animated)
}
}
Este es el uso de la subclase navigationController
elimina el "Atrás".
Estoy usando esto para eliminarlo, permanentemente a través de la aplicación.
//.h
@interface OPCustomNavigationController : UINavigationController
@end
//.m
@implementation OPCustomNavigationController
- (void)awakeFromNib
{
[self backButtonUIOverride:YES];
}
- (void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated
{
[self backButtonUIOverride:NO];
[super pushViewController:viewController animated:animated];
}
- (void)backButtonUIOverride:(BOOL)isRoot
{
if (!self.viewControllers.count)
return;
UIViewController *viewController;
if (isRoot)
{
viewController = self.viewControllers.firstObject;
}
else
{
int previousIndex = self.viewControllers.count - 1;
viewController = [self.viewControllers objectAtIndex:previousIndex];
}
viewController.navigationItem.backBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@""
style:UIBarButtonItemStylePlain
target:nil
action:nil];
}
@end
Esto es lo que estoy haciendo, lo que es más sencillo para eliminar el título del botón Atrás
override func viewDidLoad() {
super.viewDidLoad()
navigationController?.navigationBar?.backItem?.title = ""
}
Esto me funcionó en iOS10. Llame a esto desde viewDidLoad del controlador de vista.
self.navigationController?.navigationBar.topItem?.title = ""
Esto me funciona para mostrar solo el chevron ''atrás'' sin texto:
self.navigationController.navigationBar.topItem.title = @"";
Establezca esta propiedad en viewDidLoad
del controlador de vista que presenta la barra de navegación y hará el truco.
Nota: Solo lo he probado en iOS 7, que está dentro del alcance de la pregunta.
La solución simple para este problema, que funciona en iOS7 y 6, es configurar la vista de título personalizada en viewDidLoad:
- (void)viewDidLoad {
[super viewDidLoad];
UILabel *titleLabel = [[UILabel alloc] initWithFrame:CGRectZero];
titleLabel.text = self.title;
titleLabel.backgroundColor = [UIColor clearColor];
[titleLabel sizeToFit];
self.navigationItem.titleView = titleLabel;
}
Luego, en viewWillAppear: puedes llamar con seguridad
self.navigationController.navigationBar.topItem.title = @" ";
Debido a que su vista de título es una vista personalizada, no se sobrescribirá al retroceder en la pila de navegación.
Ninguna de las respuestas me ayudó. Pero un truco lo hizo: acabo de borrar el título del controlador de vista que presionó (donde va el botón de retroceso) justo antes de presionarlo.
Entonces, cuando la vista anterior no tiene un título, en iOS 7 el botón Atrás solo tendrá una flecha, sin texto.
En la viewWillAppear
de la vista que empuja, coloqué detrás el título original.
No pude hacerlo funcionar con la respuesta de Guto Araujo de navigationBar.topItem.title = @"";
Sin embargo, pude obtener el efecto deseado configurando self.title = @""
en el método init
de mi controlador de vista. (Es importante configurarlo en init
, viewDidLoad
no funcionará).
No tuve mucho éxito con las respuestas proporcionadas, pero encontré un trabajo muy simple. En su guión gráfico, puede hacer clic en el elemento de navegación de UIViewController y configurar el texto del botón Atrás. Lo puse en un solo espacio y me dio el comportamiento que estaba buscando.
Para configurar el título del botón Atrás para un controlador de vista sin cambiar su título, use:
C objetivo:
self.navigationItem.backBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"" style:self.navigationItem.backBarButtonItem.style target:nil action:nil];
Rápido:
navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)
Para que quede claro, esto se hace en el controlador de vista que verías si presionas el botón Atrás. es decir, en lugar de ver ''<Configuración'', solo quiere ver ''<'' y luego en su SettingsViewController pondría esto en su init
. Entonces, no obtendrá ninguno de los problemas del título que no se muestra cuando está mirando el controlador de vista.
Perfecta solución a nivel mundial.
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
}
Si está utilizando Storyboards, puede ir al Attributes Inspector
de Attributes Inspector
del Navigation Item
de ViewController (haga clic en la Navigation Bar
) y establezca la propiedad del Back Button
en "" (un carácter de espacio). Esto establecerá el título del Botón Atrás en un carácter de espacio, dejando el chevron visible. No hay necesidad de meterse con el código.
Tenga en cuenta que esto establecerá el título del Back Button
para el Botón Atrás que se desplazará a este Controlador de Vistas desde el que se colocó sobre él, ¡no el Back Button
que se mostrará dentro de este Controlador!
Si, como yo, estás usando una vista personalizada en lugar de UINavigationBar
y estás atascado con el botón Atrás, entonces tienes que hacer un poco de trabajo que se siente un poco aburrido.
[self.navigationController.navigationBar setHidden:NO];
self.navigationController.navigationBar.topItem.title = @"";
[self.navigationController.navigationBar setHidden:YES];
Parece que si no se presenta, no importa lo que intente mostrar un título, esto significa que se muestra y luego se oculta antes de que se dibuje y resuelve el problema.
También puedes usar esto:
UIBarButtonItem *temporaryBarButtonItem = [[UIBarButtonItem alloc] init];
temporaryBarButtonItem.title = @"";
self.navigationItem.backBarButtonItem = temporaryBarButtonItem;
[temporaryBarButtonItem release];
Esto funciona para mi
Tuve la oportunidad de improvisar algo usando la respuesta de DonnaLea. Así es como aparece la solución en mi subclase UIViewController:
var backItemTitle:String?
override func viewDidLoad() {
super.viewDidLoad()
//store the original title
backItemTitle = self.navigationController?.navigationBar.topItem?.title
//remove the title for the back button
navigationController?.navigationBar.topItem?.title = ""
}
override func willMoveToParentViewController(parent: UIViewController?) {
super.willMoveToParentViewController(parent)
if parent == nil {
//restore the orignal title
navigationController?.navigationBar.backItem?.title = backItemTitle
}
}
El problema con la respuesta original es que elimina el título del controlador cuando regresas a él. Intentar restablecer el título en viewWillDisappear es demasiado tarde en el proceso de transición; Hace que el título vuelva a encajar en lugar de animar bien. Sin embargo, el willMoveToParentViewController ocurre antes y permite el comportamiento correcto.
Advertencia: solo he probado esto con un push / pop normal de UINavigationController. Puede haber un comportamiento inesperado adicional en otras situaciones.
A veces es útil ver las cosas en contexto. Aquí hay un proyecto mínimo que oculta el texto "atrás" pero aún muestra la flecha.
Guión gráfico
Hay un show segue desde el botón "Mostrar segundo controlador de vista" hasta el segundo controlador de vista.
También agregué un elemento de navegación al segundo controlador de vista para que tuviera un título. Esto es opcional. No afecta al botón de retroceso.
Código
FirstViewController.swift
import UIKit
class FirstViewController: UIViewController {
@IBAction func showSecondViewControllerButtonTapped(sender: UIButton) {
// hide the back button text
navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)
}
}
SecondViewController.swift
import UIKit
class SecondViewController: UIViewController {
// Nothing at all needed here
}
Método alternativo (solo IB, sin código)
En el guión gráfico, seleccione el elemento de navegación para el primer controlador de vista (no el segundo). Simplemente ingrese un espacio para el texto del Botón Atrás.
SWIFT 3
navigationController?.navigationBar.topItem?.title = ""
Swift 3.1 Puede hacer esto implementando el método delegado de UINavigationController. Ocultará el título solo con el botón de retroceso, aún así obtendremos la imagen de la flecha de retroceso y la funcionalidad predeterminada.
func navigationController(_ navigationController: UINavigationController,
willShow viewController: UIViewController, animated: Bool) {
let item = UIBarButtonItem(title: " ", style: .plain, target: nil,
action: nil)
viewController.navigationItem.backBarButtonItem = item
}
case : <Back as <
override func viewWillAppear(animated: Bool) {
navigationController!.navigationBar.topItem!.title = ""
}
self.navigationController.navigationBar.topItem.title = @"";
NSDictionary *attributes = [NSDictionary dictionaryWithObjectsAndKeys:
[UIColor clearColor],UITextAttributeTextColor,
nil];
[[UIBarButtonItem appearance] setTitleTextAttributes:attributes
forState:UIControlStateNormal];
Estaba teniendo el mismo problema y lo hice de esta manera.
--EDITAR--
esta es una solución cuando realmente desea eliminar el texto del título de todo UIBarbuttonItem. Si solo desea eliminar el título del elemento del botón de la barra trasera, no hay una solución simple y conveniente. En mi caso, como solo tengo pocos UIBarButtonItems que necesitan mostrar el texto del título, simplemente cambié el título de los botones específicosTextAttributes. Si desea ser más específico, utilice el siguiente código, que solo cambiará los botones de la barra de navegación:
NSDictionary *attributes = [NSDictionary dictionaryWithObjectsAndKeys:
[UIColor clearColor],UITextAttributeTextColor,
nil];
[[UIBarButtonItem appearanceWhenContainedIn:[UINavigationBar class], nil] setTitleTextAttributes:attributes
forState:UIControlStateNormal];
extension UIViewController{
func hideBackButton(){
navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)
}
}
[[UIBarButtonItem appearance] setBackButtonBackgroundImage:backButtonImage forState:UIControlStateNormal barMetrics:UIBarMetricsDefaultPrompt];
[[UIBarButtonItem appearance] setBackButtonTitlePositionAdjustment:UIOffsetMake(10.0, NSIntegerMin) forBarMetrics:UIBarMetricsDefault];
[[UIBarButtonItem appearance] setTitleTextAttributes:@{NSForegroundColorAttributeName:[UIColor whiteColor],
NSFontAttributeName:[UIFont systemFontOfSize:1]}
forState:UIControlStateNormal];
[[UIBarButtonItem appearance] setBackButtonTitlePositionAdjustment:UIOffsetMake(-60, -60)
forBarMetrics:UIBarMetricsDefault];
A continuación, puede eliminar el título del elemento del botón Atrás.
Si usa Storyboard, puede configurar el botón Atrás del inspector de atributos de navegación con espacio.