color bar iphone objective-c uinavigationbar uinavigationitem

iphone - color - ¿Cómo cambio el título del botón "atrás" en una barra de navegación?



navigation bar swift 4 (30)

Actualmente, el valor predeterminado del botón de la barra izquierda es el título de la vista que cargó al actual, es decir, la vista que se mostrará cuando se presione el botón (botón Atrás).

Quiero cambiar el texto que se muestra en el botón a otra cosa.

Intenté colocar la siguiente línea de código en el método viewDidLoad del controlador de vista, pero no parece funcionar.

self.navigationItem.leftBarButtonItem.title = @"Log Out";

¿Qué tengo que hacer?

Gracias.


Aquí está la documentación para backBarButtonItem :

"Cuando este elemento de navegación está inmediatamente debajo del elemento superior de la pila, el controlador de navegación deriva el botón Atrás para la barra de navegación de este elemento de navegación. [...] Si desea especificar una imagen o título personalizado para el botón Atrás , puede asignar un elemento de botón de barra personalizado (con su título o imagen personalizada) a esta propiedad en su lugar ".

Controlador de vista A (el controlador de vista "principal" ):

self.title = @"Really Long Title"; UIBarButtonItem *backButton = [[UIBarButtonItem alloc] initWithTitle:@"Short" style:UIBarButtonItemStyleBordered target:nil action:nil]; self.navigationItem.backBarButtonItem = backButton;

Cuando cualquier otro controlador de vista B se encuentra en la parte superior de la pila de navegación, y A está justo debajo, el botón de retroceso de B tendrá el título "Corto" .


Aquí está la respuesta:

En viewDidAppear:animated (NO en viewDidLoad ) haga lo siguiente

- (void)viewDidAppear:(BOOL)animated { [self.navigationController.navigationBar.backItem setTitle:@"anything"]; // then call the super [super viewDidAppear:animated]; }

Eso si quieres mantener la forma del botón Atrás.


Aquí hay otra manera de hacerlo.

En su controlador de vista principal, implemente el siguiente método:

- (void) setBackBarButtonItemTitle:(NSString *)newTitle { self.navigationItem.backBarButtonItem.title = newTitle; }

En el controlador de vista de su hijo, cuando desee cambiar el título, esto funcionará:

NSArray *viewControllerArray = [self.navigationController viewControllers]; int parentViewControllerIndex = [viewControllerArray count] - 2; [[viewControllerArray objectAtIndex:parentViewControllerIndex] setBackBarButtonItemTitle:@"New Title"];

Nunca pude hacer funcionar la propiedad parentViewController :

[(ParentViewController *)(self.navigationController.parentViewController) setBackBarButtonItemTitle:@"New Title"];

No sé si es un error o no lo estoy usando correctamente. Pero al tomar el controlador de la vista segundo a último en la matriz de viewControllers apunta al controlador de la vista principal, y puedo llamar a los métodos principales correctamente con esa referencia.


De acuerdo. Yo personalmente odiaba todas estas opciones. Por eso se me ocurrió lo mío.

Basado en la información que he visto. Parece que el controlador de vista anterior tiene el control de su propio botón "Atrás" que se presentará en el controlador de vista insertado.

He creado un método de carga diferida para el elemento de navegación en el controlador que desea cambiar el botón Atrás.

El mío es un controlador de compradores invitados

Invite Buyer es el texto que se establece de forma predeterminada.

pero el botón de atrás tenía que ser Invitar

Aquí está el código que utilicé para crear el botón Atrás.

Coloqué este código en la parte superior del archivo de Implementación del Controlador (.m) y este anuló el método de los súper automáticamente.

- (UINavigationItem *)navigationItem{ UINavigationItem *item = [super navigationItem]; if (item != nil && item.backBarButtonItem == nil) { item.backBarButtonItem = [[[UIBarButtonItem alloc] init] autorelease]; item.backBarButtonItem.title = @"Invite"; } return item; }

Siento que esta es una manera mucho más elegante de lograr esto.

Coloco este código en un lugar, y se rellena automáticamente cuando es necesario.

No es necesario llamar al código antes de cada solicitud de inserción.

Espero que esto ayude


Descubrí que es mejor cambiar el título del controlador de vista actual en la pila de navegación al texto deseado del botón Atrás antes de pasar al siguiente controlador de vista.

Por ejemplo

self.navigationItem.title = @"Desired back button text"; [self.navigationController pushViewController:QAVC animated:NO];

Luego, en viewDidAppear, restablezca el título al título deseado para el VC original. Voila!


Descubrí que la forma más fácil de cambiar el nombre del botón Atrás es establecer el título de los controladores de vista en el título del botón Atrás, y luego reemplazar el título Vista en el elemento de navegación de los controladores de vista a una etiqueta personalizada con su verdadero nombre.

Me gusta esto:

CustomViewController.m

@implementation CustomViewController - (NSString*)title { return @"Back Button Title"; } - (void)viewDidLoad { [super viewDidLoad]; UILabel* customTitleView = [[UILabel alloc] initWithFrame:CGRectZero]; customTitleView.text = @"Navigation Bar Title"; customTitleView.font = [UIFont boldSystemFontOfSize:20]; customTitleView.backgroundColor = [UIColor clearColor]; customTitleView.textColor = [UIColor whiteColor]; customTitleView.shadowColor = [UIColor colorWithRed:0.0 green:0.0 blue:0.0 alpha:0.5]; customTitleView.shadowOffset = CGSizeMake(0, -1); [customTitleView sizeToFit]; self.navigationItem.titleView = [customTitleView autorelease]; } @end

Esto hará que su título en UINavigationBar se vea como si fuera nativo. Dando al controlador de vista la capacidad de tener título separado y título de botón de retroceso.

En el caso de los controladores de vista A y B, A es responsable de indicar cómo debe lucir el botón de retroceso, mientras se muestra B.

EDITAR: Esto también mantiene el aspecto original del botón Atrás (el elemento del botón de la barra de flecha izquierda).


En ChildVC esto me funcionó ...

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

¡Funciona en Swift también!

self.navigationController!.navigationBar.topItem!.title = "Back"


En Swift / iOS8, lo siguiente funcionó para mí:

let backButton = UIBarButtonItem( title: "Back Button Text", style: UIBarButtonItemStyle.Bordered, target: nil, action: nil ); self.navigationController.navigationBar.topItem.backBarButtonItem = backButton;

Portado de la respuesta de Felipe.


Este código también funciona. Ponga esto en el controlador raíz del controlador de navegación:

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


Esto debe colocarse en el método que llama al controlador de vista titulado "NewTitle". Justo antes de la declaración push o popViewController.

UIBarButtonItem *newBackButton = [[UIBarButtonItem alloc] initWithTitle:@"NewTitle" style:UIBarButtonItemStyleBordered target:nil action:nil]; [[self navigationItem] setBackBarButtonItem:newBackButton]; [newBackButton release];


Esto funciona mejor para mí. Tratar :

self.navigationController.navigationBar.topItem.backBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"Back" style:UIBarButtonItemStylePlain target:nil action:nil];


Esto funciona para mí como una versión "simplificada" de las respuestas publicadas anteriormente.

UIBarButtonItem *backButton = [[UIBarButtonItem alloc] init]; backButton.title = @"Go Back"; self.navigationItem.backBarButtonItem = backButton;

Recuerde colocar el código dentro del controlador de vista principal (por ejemplo, la vista que tiene su vista de tabla o UITableViewController), no la vista secundaria o de detalle (por ejemplo, UIViewController).

Puede localizar fácilmente la cadena del botón Atrás de esta manera:

backButton.title = NSLocalizedString(@"Back Title", nil);


La mayoría de las soluciones mata el estilo original de BackButton (el botón de la barra de flecha izquierda) mientras agrega un botón habitual con el título deseado.
Así que para mantener el estilo original hay 2 formas:
1º: usar un estilo de botón no documentado (110 o algo así) que prefiero no hacer. Pero si lo desea, puede encontrar cómo hacerlo aquí, en .
2º: Utilizar la idea de I Trenskow. Me ha gustado y lo uso un poco cambiado.
En lugar de anular el título - (NSString *), he decidido mantener el título original de la siguiente manera (lo que me permite usar los títulos de las plumillas, así como el título dado en el estado push por cierto).

- (void)viewDidLoad { [super viewDidLoad]; static NSString * backButtonTitle=@"Back"; //or whatever u want if (![self.title isEqualToString:backButtonTitle]){ UILabel* customTitleView = [[UILabel alloc] initWithFrame:CGRectZero]; customTitleView.text = self.title; // original title customTitleView.font = [UIFont boldSystemFontOfSize:20]; customTitleView.backgroundColor = [UIColor clearColor]; customTitleView.textColor = [UIColor whiteColor]; customTitleView.shadowColor = [UIColor colorWithRed:0.0 green:0.0 blue:0.0 alpha:0.5]; customTitleView.shadowOffset = CGSizeMake(0, -1); [customTitleView sizeToFit]; self.navigationItem.titleView = [customTitleView autorelease]; self.title = backButtonTitle; } }

Esta solución funciona bien y parece nativa. Además, si lo usa en el método viewDidLoad, evita la ejecución más de una vez.
También he intentado una solución de Jessedc pero se ve mal. Hace visible al cambio de la barra de título del usuario sobre la marcha del original al BackButton''s deseado y de vuelta.


La respuesta de Stan fue la mejor. Pero también tiene un problema: cuando usa el controlador con una Barra de pestañas y cambia el título del controlador, también puede cambiar el título de la Barra de pestañas. Por lo tanto, la mejor respuesta es cambiar solo view_controller.navigationItem.title y usar view_controller.navigationItem .título en la función. La respuesta está aquí: (Con ARC y agrégalos a la vista viewDidLoad)

static NSString * back_button_title=@"Back"; //or whatever u want if (![view_controller.navigationItem.title isEqualToString:back_button_title]){ UILabel* custom_title_view = [[UILabel alloc] initWithFrame:CGRectZero]; custom_title_view.text = view_controller.navigationItem.title; // original title custom_title_view.font = [UIFont boldSystemFontOfSize:20]; custom_title_view.backgroundColor = [UIColor clearColor]; custom_title_view.textColor = [UIColor whiteColor]; custom_title_view.shadowColor = [UIColor colorWithRed:0.0 green:0.0 blue:0.0 alpha:0.5]; custom_title_view.shadowOffset = CGSizeMake(0, -1); [custom_title_view sizeToFit]; view_controller.navigationItem.titleView = custom_title_view; view_controller.navigationItem.title = back_button_title; }

En mi uso, lo hago una función como esta, solo tengo la función con un código de línea en viewDidLoad.

+ (void)makeSubViewHaveBackButton:(UIViewController*) view_controller{ static NSString * back_button_title=@"Back"; //or whatever u want if (![view_controller.navigationItem.title isEqualToString:back_button_title]){ UILabel* custom_title_view = [[UILabel alloc] initWithFrame:CGRectZero]; custom_title_view.text = view_controller.navigationItem.title; // original title custom_title_view.font = [UIFont boldSystemFontOfSize:20]; custom_title_view.backgroundColor = [UIColor clearColor]; custom_title_view.textColor = [UIColor whiteColor]; custom_title_view.shadowColor = [UIColor colorWithRed:0.0 green:0.0 blue:0.0 alpha:0.5]; custom_title_view.shadowOffset = CGSizeMake(0, -1); [custom_title_view sizeToFit]; view_controller.navigationItem.titleView = custom_title_view; view_controller.navigationItem.title = back_button_title; } }


Lo sé, la pregunta es muy antigua, pero encontré una buena solución.

UIBarButtonItem *barButton = [[UIBarButtonItem alloc] init]; barButton.title = @"Custom Title"; self.navigationController.navigationBar.topItem.backBarButtonItem = barButton;

Obras de childView! Probado con iOS 7.


Ninguna de las soluciones explicadas aquí funcionó para mí. Entonces, lo que hice fue eliminar el título de la escena de donde vengo de la siguiente manera:

self.title = @"";

Así que cuando se presenta una nueva escena, el texto no aparece.

Estoy totalmente de acuerdo en que esta no es una solución clara, pero funcionó y ninguna de las explicaciones funcionó para mí.


Ok, aquí está el camino. Si tiene un controlador de vista "primero" y navega por otro controlador de vista "segundo" presionando un botón o etc., necesita hacer algún trabajo. Primero debe crear un BarButtonItem en el método ViewDidLoad del "segundo" controlador de vista como este;

UIBarButtonItem *btnBack = [[UIBarButtonItem alloc] initWithTitle:@"Back" style:UIBarButtonItemStyleBordered target:self action:@selector(OnClick_btnBack:)]; self.navigationItem.leftBarButtonItem = btnBack; [btnBack release];

Después de hacer eso, necesita escribir en el código para la acción "btnBack" en el mismo archivo .m como este;

-(IBAction)OnClick_btnBack:(id)sender { [self.navigationController popViewControllerAnimated:YES]; //[self.navigationController pushViewController:self.navigationController.parentViewController animated:YES]; }

Eso es todo.


PROBLEMA: El texto "Atrás" en la barra de navegación no puede ser reemplazado.

RAZÓN: la etiqueta "Atrás" se establece en la barra de navegación después de presionar una vista porque el atributo .title en el controlador de la vista principal se estableció en nulo (o no se inicializó).

UNA SOLUCIÓN: si configura self.title = "Whatever ..." verá que en lugar de "Back" aparecerá "Whatever ..." después de presionar el nuevo controlador de vista.


Para Swift:

// Rename back button let backButton = UIBarButtonItem( title: "Back", style: UIBarButtonItemStyle.Plain, // Note: .Bordered is deprecated target: nil, action: nil ) self.navigationController!.navigationBar.topItem!.backBarButtonItem = backButton


Para aquellos que usan guiones gráficos, seleccione el marco del controlador de la vista principal (no el que tiene la vista de destino) (asegúrese de hacer clic derecho en la barra de navegación, luego abra el inspector de atributos, donde encontrará tres entradas de formulario. La tercera " Botón de retroceso "es lo que estamos buscando.


Si no solo desea cambiar el texto del botón Atrás al mismo texto y mantener la forma original de la flecha hacia la izquierda, sino también hacer algo cuando el usuario haga clic en el botón Atrás, le recomiendo que eche un vistazo a mi " CustomNavigationController ". .


Soy nuevo en iOS, pero proporcionaré mi respuesta muy simple de anular la clase de controlador de navegación. He anulado los métodos push y pop y guardo el título del controlador de vista anterior. Lo siento por pegar en el bloque js. Estaba poco confundido cómo pasarlo en bloque de código normal.

#import "MyCustomNavController.h" @implementation MyCustomNavController { NSString *_savedTitle; } - (void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated withBackBtnTitle:(NSString *)title { _savedTitle = self.topViewController.title; self.topViewController.title = title; [super pushViewController:viewController animated:animated]; } - (UIViewController *)popViewControllerAnimated:(BOOL)animated { [self.viewControllers objectAtIndex:self.viewControllers.count - 2].title = _savedTitle; return [super popViewControllerAnimated:animated]; } @end


Tal vez estoy siendo demasiado simplista pero de la documentación de Apple la redacción es:

Si ninguno de los controladores de vista especifica un elemento de botón de barra personalizado , se usa un botón de retroceso predeterminado y su título se establece en el valor de la propiedad del título del controlador de vista anterior, es decir, el controlador de vista está un nivel más abajo. la pila.

La solución marcada como correcta anteriormente establece un elemento de botón predeterminado del controlador principal. Es la respuesta correcta, pero estoy resolviendo el problema cambiando la propiedad self.title del UIViewController justo antes de colocar el nuevo controlador en la pila NavigationController.

Esto actualiza automáticamente el título del botón Atrás en el siguiente controlador, y siempre que establezca self.title nuevo en lo que debería ser a la viewWillAppear , viewWillAppear no veo que este método cause demasiados problemas.


Tuve un controlador de vista padre con un título muy largo. Esto provocó que el texto del botón Atrás sangrara en el título del controlador de vista secundario.

Después de probar un montón de soluciones diferentes, esto es lo que terminé haciendo (ampliando el enfoque @ john.k.doe):

Utilizando Xcode 7.2, Swift 2

  1. En el Guión gráfico, agregue un Navigation Item a la escena del Controlador de vista principal (no al VC secundario)

  1. En el Attributes Inspector de Attributes Inspector de su nuevo Navigation Item , escriba un carácter de space en el campo Back Button . Más sobre esto más adelante.

  1. En el controlador de vista principal, agregue el siguiente código:

retazo:

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { switch segue.destinationViewController { case is ChildViewController: navigationItem.backBarButtonItem?.title = "" default: navigationItem.backBarButtonItem?.title = "Full Parent Title" } }

Explicación:

El tipo de botón de retroceder pertenece al controlador de vista principal. El Navigation Item le da un control al botón Atrás, de modo que puede configurar el título en código o en el Guión gráfico.

Nota:

Si deja el texto del Back Button Navigation Item como la cadena vacía predeterminada, el título del botón Atrás se convertirá en "Atrás".

Otros enfoques funcionan, ¿por qué usar este ?:

Si bien es posible anular el título del botón de retroceso en el controlador de vista secundaria, fue un desafío lograrlo hasta que ya apareciera brevemente en la pantalla.

Algunos de los enfoques construyen un nuevo botón de retroceso y anulan el existente. Estoy seguro de que funciona, y probablemente sea necesario en algunos casos de uso. Pero prefiero aprovechar las API existentes cuando sea posible.

Cambiar el title del controlador de vista principal es la solución más rápida para algunas situaciones. Sin embargo, esto cambia el título principal, por lo que debe administrar el estado. Las cosas también se ensucian con un Tab Bar Controller porque los cambios de título causan efectos secundarios con los títulos de los Tab Bar Item .


Use la siguiente línea de código:

UIBarButtonItem *newBackButton = [[UIBarButtonItem alloc] initWithTitle:@"hello" style:UIBarButtonItemStylePlain target:nil action:nil]; self.navigationItem.leftBarButtonItems =[[NSArray alloc] initWithObjects:newBackButton, nil]; self.navigationItem.leftItemsSupplementBackButton = YES;


Versión rápida:

En su hijo ViewController:

override func viewWillAppear(animated: Bool) { super.viewWillAppear(animated) self.navigationController?.navigationBar.backItem?.title = "TEXT" }


en Xcode 4.5 usando el guión gráfico, la solución más fácil que he encontrado cuando el valor del botón Atrás no tiene que cambiar dinámicamente es utilizar el campo "Botón Atrás" asociado con el elemento de navegación del Controlador de vista al que Quiero que el botón "Atrás" diga algo más.

por ejemplo, en la captura de pantalla a continuación, quiero que el botón Atrás para los controladores de vista que presiono tenga "Atrás" como el título del botón Atrás.

por supuesto, esto no funcionará si necesita el botón de retroceso para decir algo ligeramente cada vez ... hay todas las otras soluciones aquí para eso.


self.navigationController.navigationBar.backItem.title = @"TEXT";

Y en Swift:

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


UIBarButtonItem *btnBack = [[UIBarButtonItem alloc] initWithTitle:@"Back" style:UIBarButtonItemStyleBordered target:self action:@selector(OnClick_btnBack:)]; self.navigationItem.leftBarButtonItem = btnBack; [btnBack release];


self.navigationItem.backBarButtonItem = [[[UIBarButtonItem alloc] initWithTitle:@"Log out" style:UIBarButtonItemStyleDone target:nil action:nil] autorelease];

Puede colocarlo donde desee en el código del controlador de permisos, lo que le permite tener diferentes botones de respaldo para diferentes vistas secundarias.