Pergunta

Atualmente, o valor padrão botão da barra esquerda é o título da opinião de que carregado o atual, em outras palavras, a fim de ser mostrada quando o botão é pressionado (botão voltar).

Eu quero mudar o texto mostrado no botão para outra coisa.

Eu tentei colocar a seguinte linha de código no método viewDidLoad do controlador de vista, mas não parece trabalho.

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

O que devo fazer?

Graças.

Foi útil?

Solução

Este deve ser colocado no método que chama o ViewController intitulado "newTitle". Logo antes da declaração de pressão ou popViewController.

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

Outras dicas

Em ChildVC isso funcionou para mim ...

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

Obras em Swift também!

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

Aqui está a documentação para backBarButtonItem :

"Quando este item de navegação é imediatamente abaixo do item superior na pilha, o controlador de navegação deriva o botão de volta para o barra de navegação a partir deste item de navegação. [...] Se você quiser especificar uma imagem personalizada ou título para o botão de volta, você pode atribuir um item personalizado botão de bar (com o título personalizado ou imagem) para este propriedade em vez. "

View Controller A (o "pai" controlador de vista):

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

Quando qualquer outro controlador de vista B está no topo da pilha de navegação, e A é logo abaixo dela, B botão voltar 's terá o título "Short" .

no Xcode 4.5 usando storyboard, de longe, a solução mais fácil que eu encontrei quando o valor do botão Voltar não tem que alterar dinamicamente é usar o campo "Botão Voltar" associado ao item de navegação do controlador de vista para o qual você deseja que o botão "Voltar" para dizer algo mais.

por exemplo. na imagem abaixo, eu quero o botão Voltar para o controlador de vista (s) que eu empurrar para ter "Voltar", como o título do botão Voltar.

enter descrição da imagem aqui

é claro, isso não vai funcionar se você precisa o botão de volta para dizer algo um pouco diferente de cada vez ... há todas as outras soluções aqui para isso.

Eu sei, a questão é muito antiga, mas eu achei uma solução agradável.

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

Obras de childView! Testado com iOS 7.

Talvez eu esteja sendo mais simplista, mas a partir da documentação da Apple a redação é a seguinte:

Se um costume item de botão da barra não é especificado por qualquer um dos controladores de vista, um botão padrão de volta é usado e seu título é definido para o valor do título propriedade da exibição anterior do controlador, isto é, a visão de um controlador de baixo nível na pilha.

A solução marcada conjuntos acima corrigir um item de botão padrão do controlador pai. É a resposta certa, mas eu estou resolvendo o problema alterando propriedade self.title do UIViewController direita antes de empurrar o novo controlador na pilha NavigationController.

Isso atualiza automaticamente o título do botão voltar no próximo controlador, e contanto que você definir self.title de volta para o que deveria ser em viewWillAppear eu não posso ver este método causando muitos problemas.

Este trabalho melhor para mim. Tente:

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

Em Swift / iOS8, a seguir trabalhou para mim:

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

self.navigationController.navigationBar.topItem.backBarButtonItem = backButton;

portados de resposta de Felipe.

Ok, aqui é o caminho. Se você tem um controlador de vista "primeiro" e você navegar outro controlador de vista "segunda" pressionando um botão ou etc. você precisa fazer algum trabalho. Primeiro você precisa criar um BarButtonItem no "segundo" método ViewDidLoad vista do controlador como este;

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

Depois de fazer isso, você precisa escrever o código para a ação "btnBack" no mesmo arquivo .m assim;

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

Isso é tudo.

Eu tinha um controlador de vista pai com um tempo muito longo título. Isto resultou no texto botão voltar sangramento no título do controlador de vista da criança.

Depois de tentar um monte de diferentes soluções, é isso que eu acabei fazendo (expandindo a abordagem @ john.k.doe):

Usando o Xcode 7.2, Swift 2

  1. No Storyboard, adicione um Navigation Item ao pai cena View Controller (não a criança VC)

navegação alínea

  1. No Attributes Inspector do seu novo Navigation Item, digitar um caractere space no campo Back Button. Mais sobre isso mais tarde.

navegação item na exibição de hierarquia

add um caractere de espaço para o campo Botão Back

  1. No pai controlador de vista, adicione o seguinte código:

trecho:

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

Explicação:

O botão de classificação de trás de pertence ao controlador de exibição pai. O Navigation Item dá-lhe um identificador para o botão Voltar, então você pode definir o título no código ou no Storyboard.

Nota:

Se você deixar o texto Navigation Item Back Button como a string vazia padrão, o título botão voltar ficará "Back".

Outras abordagens de trabalho, por que usar este:?

Embora seja possível substituir o título botão voltar no controlador de vista da criança, era um desafio conseguir um identificador para ele até que ele já tinha brilhou brevemente na tela.

Algumas das abordagens construir um novo botão voltar e substituir o existente. Tenho certeza de que ele funciona, e provavelmente necessário em alguns casos de uso. Mas eu prefiro APIs existentes alavancagem, quando possível.

A alteração do title do controlador de vista dos pais é a solução mais rápida para algumas situações. No entanto, isso muda o título pai então você tem que gerenciar o estado. As coisas também ficar confuso com um Tab Bar Controller porque título muda efeitos colaterais causa com os títulos Tab Bar Item.

Para aqueles que usam storyboards basta selecionar o pai (não a que está segurando vista alvo) moldura de controlador de exibição (não se esqueça que você clique direito na barra de navegação, então atributos abertos inspector, onde você encontrará três entradas de formulário. O terceiro botão "back" é que estamos procurando.

Versão Swift:

Em seu filho ViewController:

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

Aqui está outra maneira de fazê-lo.

Em seu controlador vista pai, implementar o seguinte método:

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

Em seu controlador de vista da criança, quando você quer mudar o título, isso vai funcionar:

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

Eu nunca fui capaz de obter a propriedade parentViewController ao trabalho:

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

Eu não sei se isso é um bug ou eu não estou usando-o corretamente. Mas agarrando o segundo ao último controlador de vista na matriz viewControllers aponta para o controlador de vista pai, e eu posso chamar métodos pais corretamente com essa referência.

ok. Eu, pessoalmente, odiava todas essas opções. Por isso eu vim com a minha própria.

Com base nas informações que tenho visto. Parece que o controlador de vista anterior está no controle de seu próprio botão "Voltar" que será apresentado no controlador de vista empurrado.

Eu criei um método de carga preguiçoso para o navigationItem no controlador que quer o botão Voltar alterado.

O meu é um convite Comprador Controlador

Convidar Comprador é o texto que é definido por padrão.

mas o botão de volta precisava estar convida

Aqui está o código que eu usei para criar o botão de volta.

Eu coloquei este código na parte superior do ficheiro do controlador Implementatio (.m) e cancelou o método do Super automaticamente.

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

    return item;
}

Eu sinto que esta é uma maneira muito mais elegante para fazer isso.

eu colocar esse código em um lugar, e ele automaticamente é preenchido quando necessário.

Não há necessidade de chamar o código antes de cada solicitação de envio.

Espero que isso ajude

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

Aqui está a resposta:

Em viewDidAppear:animated (NÃO incluídos no viewDidLoad) faça o seguinte

- (void)viewDidAppear:(BOOL)animated
{
     [self.navigationController.navigationBar.backItem setTitle:@"anything"];

     // then call the super
     [super viewDidAppear:animated];
}

Isso se você quiser manter a forma do botão de volta.

Nenhuma das soluções explicado aqui funcionou para mim. Então o que eu fiz foi remover o título da cena onde eu vim da seguinte maneira:

self.title = @"";

faz isso quando nova cena é apresentado o texto de volta não aparecer.

Eu absoluty concordam que esta não é uma solução clara em tudo, mas trabalhou e nenhum dos explicou trabalhou para mim.

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

Eu descobri que a maneira mais fácil de mudar o nome do botão de volta é para definir o título da vista controladores para o título do botão voltar, e depois substituindo o titleView no item de navegação vista controladores para uma etiqueta personalizada com o seu nome real.

Como esta:

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

Isso fará com que o seu título em UINavigationBar olhar como se fosse nativa. Dando o controlador de vista a capacidade de ter separado título e título do botão de volta.

No caso do controlador de vista A e B, A é responsável por dizer como ele é botão voltar deve olhar, enquanto B é exibido.

EDIT:. Isso também mantém a aparência nativa botão voltar (O bar arrowed item de botão esquerdo)

Esse código funciona também. Coloque isso no controlador de raiz do controlador de navegação:

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

Descobri que é melhor para alterar o título do controlador de vista atual na pilha de navegação para o texto desejado do botão Voltar antes de empurrar para o próximo controlador de vista.

Por exemplo

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

Em seguida, no viewDidAppear definir a volta título para o título desejado para o VC originais. Voila!

Sou novo no iOS, mas vou dar minha resposta muito simples de substituir a classe controlador de navegação. Eu tenho simples substituição a empurrar e pop métodos e guardar o título de controlador de exibição anterior. Desculpe para colar no bloco js. Foi pouco confuso como passado no bloco 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

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

E em Swift:

self.navigationController?.navigationBar.backItem?.title = "TEXT"
self.navigationItem.backBarButtonItem = [[[UIBarButtonItem alloc] 
                                              initWithTitle:@"Log out" 
                                              style:UIBarButtonItemStyleDone 
                                              target:nil 
                                              action:nil] autorelease];

Você pode colocá-lo onde quer que você gosta no código no controlador Parrent, que allowes você tenha backbuttons differenct para diferentes pontos de vista da criança.

A maioria das soluções mata o estilo original do BackButton (O botão da barra esquerda arrowed) ao adicionar um botão de costume com o título desejado.
Portanto, para manter o estilo original existem 2 formas:
1º: Para usar o estilo de botão em situação irregular (110 ou algo parecido) que eu prefiro não fazer. Mas se você quiser você pode encontrar a forma de fazê-lo aqui, em stackoverflow.
2º: Para usar I ideia do Trenskow. Eu gostei e eu usá-lo um pouco alterado.
Em vez de substituir -. (NSString *) Título eu decidi manter o título original da seguinte forma (o que me permite usar títulos do nib, bem como determinado título no estado impulso btw)

- (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 solução funciona bem e parece nativa. Além disso, se usá-lo no método viewDidLoad que impede a execução mais de 1 hora.
Também eu tentei uma solução de Jessedc mas parece ruim. Isso faz com que visível a mudança barra de título do usuário em tempo real do original para BackButton do desejado e volta.

Isso funciona para mim como uma versão "simplificada" das respostas postadas anteriores.

UIBarButtonItem *backButton = [[UIBarButtonItem alloc] init];

backButton.title = @"Go Back";

self.navigationItem.backBarButtonItem = backButton;

Lembre-se de colocar o código dentro do controlador de vista dos pais (por exemplo, a visão de que tem a sua exibição de tabela ou UITableViewController), não a criança ou vista de detalhe (por exemplo UIViewController).

Você pode facilmente localizar a string botão voltar como esta:

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

Temos dois do VC A e B.

Se você quiser título mudança na B, escrever esse código em um

- (IBAction)goToBViewController:(UIButton *)sender {

    BViewController *vc = [self.storyboard instantiateViewControllerWithIdentifier:@"VC"];
    UIBarButtonItem *newBackButton = [[UIBarButtonItem alloc] initWithTitle:@"Your title here"
                                                                  style:UIBarButtonItemStylePlain
                                                                 target:nil
                                                                 action:nil];
    [[self navigationItem] setBackBarButtonItem:newBackButton];
    [self.navigationController pushViewController:vc animated:NO];

}

Swift 4.1 Xcode 9.4

let secondViewController = self.storyboard?.instantiateViewController(withIdentifier: "VC"])
let newBackButton = UIBarButtonItem.init(title: "Your title here", style: UIBarButtonItemStyle.plain, target: nil, action: nil)
navigationController?.navigationBar.topItem?.backBarButtonItem = newBackButton
navigationController?.pushViewController(secondViewController!, animated: true)

A resposta de Stan era o melhor. Mas também tem um problema, quando você usar o controlador com um Bar Tab e altere o título do controlador, você pode mudar o título do Bar Tab too.So a melhor resposta é mudar o view_controller.navigationItem.title única e usar o view_controller.navigationItem .title na função. Resposta está aqui: (Com ARC e adicioná-los em viewDidLoad de vista)

  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;
  }

Em me usar, eu faço-lhe uma função como esta, só tem a característica com um código de linha no 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;
  }
}

Se você quiser não só para mudar o texto do botão Voltar ao mesmo texto e continuam a forma esquerda-seta original, mas também para fazer algo quando o usuário clica no botão Voltar, eu recomendo que você tenha um olhar ao redor da minha " CustomNavigationController ".

PROBLEMA:. Texto "Voltar" na barra de navegação não pode ser substituído

MOTIVO:. Rótulo de "Back" é definido na barra de navegação depois de empurrar uma visão porque o atributo .title no controlador vista pai foi definida a zero (ou não inicializado)

UMA SOLUÇÃO:. Se você definir o self.title = "Seja qual for ..." você vai ver que em vez de "Back" aparecerá "O que quer que ..." depois de empurrar novo controlador de vista

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top