Pergunta

O botão "back" de um UINavigationController por mostras padrão o título da última exibição na pilha. Existe uma maneira para que o texto personalizado no botão voltar vez?

Foi útil?

Solução

De este link :

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

Como Tyler disse nos comentários:

não fazer isso no controlador de vista visível, mas na visão controlador que você veria se você acertar o botão Voltar

Outras dicas

Você pode definir o texto na Interface Builder:

Selecione o item de navegação do ViewController que o botão voltar voltaria a:

enter descrição da imagem aqui

No Inspetor atributo painel utilitários, digite o seu rótulo para o botão Voltar:

enter descrição da imagem aqui

Eu preferiria esta abordagem ao longo ajustando o título no código como na resposta aceita.

Além disso, observe que você precisa fazer isso em nível um controlador de vista o pilha. Em outras palavras, não faça isso no controlador de vista visível, mas no controlador de vista que você veria se você apertar o botão de volta.
- Tyler

Eu uso este:

// In the current view controller, not the one that is one level up in the stack
- (void)viewDidLoad {
    [super viewDidLoad];
    self.navigationController.navigationBar.backItem.title = @"Custom text";
}

Eu encontrei uma solução útil para isso, simplesmente ajustando o título do controlador antes de empurrar outro controlador na pilha, como este:

self.navigationItem.title = @"Replacement Title";
[self.navigationController pushViewController:newCtrl animated:YES];

Em seguida, certifique-se de definir o título original em viewWillAppear, como este:

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

Isso funciona porque o comportamento padrão do UINavigationController ao construir o botão voltar durante uma operação de impulso é usar o título do controlador anterior.

O título do botão de volta o padrão é o título da vista anterior para um uso rápido truque que é colocar o seguinte código no arquivo .m da exibição anterior.

-(void)viewWillAppear:(BOOL)animated {

    // Set title
    self.navigationItem.title=@"Original Title";
}

-(void)viewWillDisappear:(BOOL)animated {

    // Set title
    self.navigationItem.title=@"Back";
}

no seu método init, adicione o seguinte código:

- (id)initWithStyle:(UITableViewStyle)style {
    if(self = [super init]) {

        //...

        UIBarButtonItem *customBackButton = [[UIBarButtonItem alloc] initWithTitle:@"Back" 
                                             style:UIBarButtonItemStylePlain 
                                            target:self 
                                            action:@selector(goBack)];
        self.navigationItem.leftBarButtonItem = customBackButton;
        [customBackButton release];

        //...
    }
    return self;
}

em seguida, adicione um método simples, para permitir despedida viewcontroller:

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

Adicione o seguinte código no viewDidLoad ou loadView

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

Eu testei-o em iPhone e iPad com iOS 9

Somando-se a resposta de rédea. Nota docs da Apple que a declaração de backBarButtonItem é a seguinte:

@property(nonatomic, retain) UIBarButtonItem *backBarButtonItem

Portanto, a resposta de rédea vai vazar memória porque o setter sintetizado vai retain a instância que você passá-lo, que nunca é liberada explicitamente. Você pode resolver isso usando autorelease

 self.navigationItem.backBarButtonItem = 
      [[[UIBarButtonItem alloc] initWithTitle:@"Custom Title" 
         style:UIBarButtonItemStyleBordered
         target:nil
         action:nil] autorelease];  //<-- autoreleased

Ou você poderia apontar uma variável no exemplo para que possa liberá-lo explicitamente depois:

UIBarButtonItem* item = ...
self.navigationItem.backBarButtonItem = item;
[item release];

Espero que isso ajude!

- (void)viewDidLoad {
  [super viewDidLoad];

  UIBarButtonItem *backButton = [[UIBarButtonItem alloc] initWithTitle:@"Back" style:UIBarButtonItemStylePlain target:nil action:nil];
  self.navigationItem.backBarButtonItem = backButton;
  [backButton release];
}

Eu descobri algo interessante. Se você subclasse o UINavigationController e substituir o método pushViewController:animated: e fazer algo como isto: (tenha em mente que eu estou usando ARC)

UIBarButtonItem *backButton = [[UIBarButtonItem alloc] 
 initWithTitle: @"Back" 
 style: UIBarButtonItemStyleBordered
 target: nil action: nil];

viewController.navigationItem.backBarButtonItem = backButton;

[super pushViewController:viewController animated:animated];

Então para todos ViewControllers que são empurrados com o seu controlador de navegação terá o botão "Voltar" no-las automaticamente. Se você quer mudar o texto para certos controladores de vista que você pode experimentar e talvez lançar o viewcontroller a uma determinada classe ou o seu próprio protocolo personalizado (que suas herda viewcontroller a partir do qual poderia ter um método como backButtonText ou algo bobo assim) que pode dar você certas informações relativas à viewcontroller que está vindo em sothat você pode personalizar o texto do botão de volta para ele. Agora, o texto do botão de volta é tomado cuidado em um lugar que deve manter a responsabilidade unicamente. Eu tenho que admitir que a criação de um novo botão para mudar o texto é uma porcaria, mas tudo bem.

Alguém pode pensar em uma razão por que não fazê-lo assim? Pelo menos você não tem que mexer com títulos viewcontroller ou tem que se lembrar de criar um novo botão voltar antes de empurrar a viewcontroller no controlador de navegação.

A resposta de rédea funciona bem.

Note que se você empurrar mais de um controlador de vista, o título botão voltar alterado aparecerá para cada um deles, que não pode ser o que quiser.

Nesse caso, você vai precisar para criar o costume UIBarButtonItem cada vez que você apertar um controlador de vista.

Além disso, certifique-se de fazê-lo antes empurrar o controlador de vista, caso contrário você terá um soluço tela como as mudanças de título.

Expandindo a sugestão de Aubrey, você pode fazer isso no controlador da Criança:

criar duas variáveis ??para armazenar os valores antigos de navigationItem.title do pai e do pai navigationItem

UINavigationItem* oldItem;
NSString* oldTitle;

em viewDidLoad, adicione o seguinte:

oldItem = self.navigationController.navigationBar.topItem;  
oldTitle = oldItem.title;  
[oldItem setTitle: @"Back"];  

em viewWillDisappear, adicione o seguinte:

[oldItem setTitle: oldTitle];  
oldTitle = nil;  // do this if you have retained oldTitle
oldItem = nil;   // do this if you have retained oldItem

Não é perfeito. Você vai ver o título da mudança vista pai como o novo controlador é animado. Mas isso faz atingir a meta de costume rotular o botão de volta e mantê-lo em forma de um botão padrão de volta.

Coloque isso em você viewDidLoad, espero que isso irá resultar no que você está procurando

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

Se você quiser título set em chegar controlador (às vezes mais lógica ..) em Swift 3 fazer:

func setBackButtonNavBar(title: String, delay: Double){

    let when = DispatchTime.now() + delay
    DispatchQueue.main.asyncAfter(deadline: when, execute: { () -> Void in

        if let navBar = self.navigationController?.navigationBar{
            navBar.backItem?.title = title
        }
    })

}

no próximo controlador:

override func viewDidLoad() {
    super.viewDidLoad()
    self.setBackButtonNavBar(title: "back", delay: 0.3)
}

Normalmente eu coloquei self.setBackButtonNavBar em uma extensão de controlador.

Eu sei que isto é uma questão de idade e tipo de fora atualizadas das respostas!

A maneira mais fácil é fazer isso em ViewController pai:

ou seja o que leva você para o próximo controlador de vista.

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

Fazer isso no código remover o estilo de botão de trás do UINavigationConroller. Se você adicionar um item de navegação em cada um dos pontos de vista seu, você pode definir o título do botton volta no StoryBoard.

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