O "botão voltar" de a UINavigationController
por padrão mostra o título da última exibição na pilha. Existe uma maneira de ter texto personalizado no botão Voltar?
O "botão voltar" de a UINavigationController
por padrão mostra o título da última exibição na pilha. Existe uma maneira de ter texto personalizado no botão Voltar?
Respostas:
A partir deste link :
self.navigationItem.backBarButtonItem =
[[UIBarButtonItem alloc] initWithTitle:@"Custom Title"
style:UIBarButtonItemStylePlain
target:nil
action:nil];
Como Tyler disse nos comentários:
não faça isso no controlador de exibição visível, mas no controlador de exibição que você veria se apertasse o botão Voltar
release
o UIBarButtonItem
.
UIBarButtonItemStyleBordered
com uma chamada para a propriedade self.navigationItem.backBarButtonItem.style
. Documentação: developer.apple.com/library/ios/documentation/uikit/reference/…
Você pode definir o texto no Interface Builder:
Selecione o item de navegação do ViewController ao qual o botão Voltar retornaria:
No inspetor de atributos do painel de utilitários, insira sua etiqueta para o Botão Voltar:
Eu preferiria essa abordagem ao invés de definir o título no código, como na resposta aceita.
Observe também que você precisa fazer isso no controlador de exibição um nível acima da pilha. Em outras palavras, não faça isso no controlador de exibição visível, mas no controlador de exibição que você veria se apertasse o botão Voltar.
--Tyler
Eu uso isso:
// 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";
}
Encontrei uma solução útil para isso, basta definir o título do controlador antes de colocar outro controlador na pilha, desta forma:
self.navigationItem.title = @"Replacement Title";
[self.navigationController pushViewController:newCtrl animated:YES];
Em seguida, certifique-se de definir o título original viewWillAppear
, assim:
-(void)viewWillAppear:(BOOL)animated
{
...
self.navigationItem.title = @"Original Title";
...
}
Isso funciona porque o comportamento padrão UINavigationController
ao construir o botão voltar durante uma operação de envio é usar o título do controlador anterior.
O título do botão Voltar é padronizado com o título da visualização anterior, portanto, um truque rápido que eu uso é colocar o seguinte código no arquivo .m da visualizaçã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;
}
adicione um método simples, para permitir que o viewcontroller seja descartado:
-(void)goBack {
[self.navigationController popViewControllerAnimated:YES];
}
Adicione o seguinte código em viewDidLoad ou loadView
self.navigationController.navigationBar.topItem.title = @"Custom text";
Eu testei no iPhone e iPad com iOS 9
navigationController
e topItem
, por exemplo:self.navigationController?.navigationBar.topItem?.title = "Custom Text"
Adicionando a resposta da rédea. Observe nos documentos da Apple que a declaração de backBarButtonItem é esta:
@property(nonatomic, retain) UIBarButtonItem *backBarButtonItem
Portanto, a resposta da rédea vazará memória porque o setter sintetizado será retain
a instância em que você a passa, que nunca é liberada explicitamente. Você pode remediar isso usandoautorelease
self.navigationItem.backBarButtonItem =
[[[UIBarButtonItem alloc] initWithTitle:@"Custom Title"
style:UIBarButtonItemStyleBordered
target:nil
action:nil] autorelease]; //<-- autoreleased
Ou você pode apontar uma variável para a instância para liberá-la explicitamente mais tarde:
UIBarButtonItem* item = ...
self.navigationItem.backBarButtonItem = item;
[item release];
Espero que isto ajude!
Eu descobri algo interessante. Se você subclassificar UINavigationController
e substituir o pushViewController:animated:
método e fizer algo assim: (lembre-se de que estou usando o 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 os ViewControllers
que são pressionados com o seu controlador de navegação, o botão "Voltar" aparecerá automaticamente. Se você deseja alterar o texto de determinados controladores de exibição, pode tentar converter o viewcontroller para uma determinada classe ou seu próprio protocolo personalizado (que o seu viewcontroller herda do qual poderia ter um método comobackButtonText
ou algo parvo), que pode fornecer a você certas informações no controlador de exibição que estão chegando para que você possa personalizar o texto do botão Voltar. Agora, o texto do botão Voltar é tratado em um local que deve ser de responsabilidade exclusiva. Eu tenho que admitir que criar um novo botão para alterar o texto é uma porcaria, mas tudo bem.
Alguém pode pensar em uma razão pela qual não fazê-lo assim? Pelo menos você não precisa mexer nos títulos dos controladores de visualização ou precisa se lembrar de criar um novo botão Voltar antes de pressionar o controlador de visualização no controlador de navegação.
A resposta da rédea funciona bem.
Observe que, se você pressionar mais de um controlador de exibição, o título do botão Voltar alterado será exibido para cada um deles, o que pode não ser o desejado.
Nesse caso, você precisará criar o UIBarButtonItem personalizado sempre que pressionar um controlador de exibição.
Além disso, certifique-se de fazê-lo antes de pressionar o controlador de exibição, caso contrário, você verá um soluço na tela conforme o título for alterado.
Expandindo a sugestão de Aubrey, você pode fazer isso no controlador de exibição filho:
crie duas variáveis para armazenar os valores antigos do navigationItem.title do pai e o navigationItem do pai
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ê verá o título da visualização pai mudar à medida que o novo controlador é animado. MAS isso atinge o objetivo de rotular o botão voltar personalizado e mantê-lo em forma de um botão voltar padrão.
Coloque isso em você viewDidLoad
, espero que resulte 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ê deseja definir o título no controlador ARRIVING (às vezes mais lógico ..) no swift 3, faça:
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)
}
geralmente coloco self.setBackButtonNavBar em uma extensão do controlador.
Sei que essa é uma pergunta antiga e as respostas estão atualizadas!
A maneira mais fácil é fazer isso no ViewController pai:
ou seja, aquele que leva você ao próximo controlador de exibição.
self.navigationItem.backBarButtonItem = UIBarButtonItem(title: "Custom text here", style: .plain, target: nil, action: nil)
Fazendo isso no código, remova o estilo do botão Voltar do UINavigationConroller
. Se você adicionar um Item de Navegação em cada uma das suas visualizações, poderá definir o título do botão de retorno no StoryBoard
.
self.navigationController.navigationBar.topItem.title = @"Custom text";