Como posso ocultar o texto do botão Voltar de um controlador UINavigation? Eu terei apenas o "<" e não "<Voltar"
Como posso ocultar o texto do botão Voltar de um controlador UINavigation? Eu terei apenas o "<" e não "<Voltar"
Respostas:
No construtor de interface , você pode selecionar o item de navegação do controlador anterior e alterar a Back Button
sequência para o que você gostaria que o botão voltar aparecesse. Se quiser em branco, por exemplo, basta colocar um espaço.
Você também pode alterá-lo com esta linha de código:
[self.navigationItem.backBarButtonItem setTitle:@"Title here"];
Ou em Swift :
self.navigationItem.backBarButtonItem?.title = ""
Back Button
já estiver em branco no IB, basta adicionar um espaço para se livrar Back
e apenas mostrar a seta.
Você também pode fazer isso por meio do storyboard. No inspetor de atributos do item de navegação do controlador anterior você pode definir "" no campo do botão Voltar. Consulte a imagem abaixo. Substitua "Seu título aqui" por "". Ao fazer isso, você alcançará o resultado desejado. Você não precisa mais mexer com o 'Título'.
Você pode usar de forma programática
[self.navigationItem.backBarButtonItem setTitle:@" "];
onde self se refere ao controlador que aciona o controlador de visualização desejado.
Amostra antes, depois da barra de navegação
Antes
Depois de
backBarButtonItem
programaticamente não funciona, mas configurá-lo por meio do storyboard, sim.
Você pode implementar UINavigationControllerDelegate
assim:
func navigationController(navigationController: UINavigationController, willShowViewController viewController: UIViewController, animated: Bool) {
let item = UIBarButtonItem(title: " ", style: .Plain, target: nil, action: nil)
viewController.navigationItem.backBarButtonItem = item
}
class MyNavigationController: UINavigationController, UINavigationControllerDelegate {
override func viewDidLoad() {
super.viewDidLoad()
self.delegate = self
}
func navigationController(_ navigationController: UINavigationController, willShow viewController: UIViewController, animated: Bool) {
let item = UIBarButtonItem(title: " ", style: .plain, target: nil, action: nil)
viewController.navigationItem.backBarButtonItem = item
}
}
backBarButtonItem
é nil
por padrão e afeta o próximo controlador enviado, então basta configurá-lo para todos os controladores
Definindo o título do botão Voltar para @""
ounil
não funcionará. Você precisa definir todo o botão vazio (sem um título ou imagem):
[self.navigationItem setBackBarButtonItem:[[UIBarButtonItem alloc] initWithTitle:@"" style:UIBarButtonItemStylePlain target:nil action:nil]];
self.navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)
Isso deve ser feito no controlador de visualização que está no topo de seu controlador de visualização na pilha de navegação (ou seja, de onde você navega para o seu VC via pushViewController
método)
Outra solução para esse problema para situações em que você tem muitos controladores de visualização é usar um UIAppearance
proxy para ocultar efetivamente o texto do título do botão Voltar, como este:
UIBarButtonItem *navBarButtonAppearance = [UIBarButtonItem appearanceWhenContainedIn:[UINavigationBar class], nil];
[navBarButtonAppearance setTitleTextAttributes:@{
NSFontAttributeName: [UIFont systemFontOfSize:0.1],
NSForegroundColorAttributeName: [UIColor clearColor] }
forState:UIControlStateNormal];
Essa solução renderizará o texto como um pequeno ponto claro, semelhante a definir manualmente o título do botão Voltar como @" "
, exceto que afeta todos os botões da barra de navegação.
Não sugiro isso como uma solução geral para o problema porque afeta todos os botões da barra de navegação. Ele inverte o paradigma para que você escolha quando mostrar os títulos dos botões, em vez de quando ocultar os títulos.
Para escolher quando mostrar os títulos, restaure manualmente os atributos do texto do título conforme necessário ou crie uma subclasse especializada UIBarButtonItem
que faça o mesmo (potencialmente com outro UIAppearance
proxy).
Se você tem um aplicativo em que a maioria dos títulos dos botões Voltar precisa ser ocultada e apenas alguns (ou nenhum) dos botões de navegação são botões do sistema com títulos, isso pode ser para você!
(Observação: a alteração do tamanho da fonte é necessária, embora a cor do texto seja clara, a fim de garantir que títulos longos não façam com que o título da barra de navegação central se desloque)
Adicione o seguinte código em viewDidLoad ou loadView
self.navigationController.navigationBar.topItem.title = @"";
Testei no iPhone e iPad com iOS 9
Você pode adicionar esta categoria Objective-C para fazer com que todos os botões "Voltar" criados por um controlador de navegação não tenham texto. Acabei de adicioná-lo ao meu arquivo AppDelegate.m.
@implementation UINavigationItem (Customization)
/**
Removes text from all default back buttons so only the arrow or custom image shows up.
*/
-(UIBarButtonItem *)backBarButtonItem
{
return [[UIBarButtonItem alloc] initWithTitle:@"" style:UIBarButtonItemStylePlain target:nil action:nil];
}
@end
PS - (Não sei como fazer esta extensão funcionar com Swift, estava tendo erros estranhos. Edições bem-vindas para adicionar uma versão Swift)
override
isso rapidamente. Pergunta muito interessante
Tentei alguns acima e abaixo, mas não funcionaram. Isso funcionou para mim:
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
self.navigationController?.navigationBar.topItem?.title = ""
}
A única coisa que funciona sem efeitos colaterais é criar um botão Voltar personalizado. Contanto que você não forneça uma ação personalizada, até mesmo o gesto de deslizar funciona.
extension UIViewController {
func setupBackButton() {
let customBackButton = UIBarButtonItem(title: " ", style: .plain, target: nil, action: nil)
navigationItem.backBarButtonItem = customBackButton
}}
Infelizmente, se você quiser que todos os botões de voltar no não tenham títulos, você precisa configurar este botão de voltar personalizado em todos os seus controladores de visualização: /
override func viewDidLoad() {
super.viewDidLoad()
setupBackButton()
}
É muito importante que você defina um espaço em branco como título e não a string vazia.
para remover o texto do botão de fundo programaticamente, usado abaixo do Código, isso funcionará no xcode7 e acima.
self.navigationController.navigationBar.topItem.title = @ "";
ou
manualmente em storyboards, selecione a barra de navegação no controlador de visualização e coloque "" no texto do botão Voltar.
isso vai funcionar. obrigado
self.navigationController?.navigationBar.topItem?.title = " "
no Xcode 9 e funcionou!
A resposta atual não estava funcionando. eu queria remover o título inteiramente, mas o texto "voltar" não estava indo embora.
Volte para o controlador de visualização anterior e defina sua propriedade de título:
self.title = @" ";
SÓ funciona quando o View Controller anterior não tem um título
@""
.
Maneira alternativa - use a classe NavigationBar personalizada.
class NavigationBar: UINavigationBar {
var hideBackItem = true
private let emptyTitle = ""
override func layoutSubviews() {
if let `topItem` = topItem,
topItem.backBarButtonItem?.title != emptyTitle,
hideBackItem {
topItem.backBarButtonItem = UIBarButtonItem(title: emptyTitle, style: .plain, target: nil, action: nil)
}
super.layoutSubviews()
}
}
Ou seja, isso remove títulos de todo o projeto. Basta definir a classe personalizada para UINavigationController.
Defina o Título do VC anterior como string "" com espaço. e o título com o botão Voltar será substituído por uma string de espaço simples.
Self.title = " "
Em Voltar, pressione novamente para redefinir o título para o original no viewWillAppear.
Use um costume NavigationController
que substituipushViewController
class NavigationController: UINavigationController {
override func pushViewController(_ viewController: UIViewController, animated: Bool) {
viewController.navigationItem.backBarButtonItem =
UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)
super.pushViewController(viewController, animated: animated)
}
}
Muitas respostas já, aqui estão meus dois centavos sobre o assunto. Achei essa abordagem realmente robusta. Você só precisa colocar isso em viewController antes de seguir.
Swift 4:
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)
}
Tentei de tudo neste post. A única solução de trabalho é @VoidLess's
Aqui está a mesma resposta, mas mais completa
class CustomNavigationController: UINavigationController {
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
self.delegate = self
}
}
// MARK:UINavigationControllerDelegate
extension CustomNavigationController {
func navigationController(_ navigationController: UINavigationController, willShow viewController: UIViewController, animated: Bool) {
viewController.navigationItem.backBarButtonItem = UIBarButtonItem(title: " ", style: .plain, target: nil, action: nil)
}
}
Esta é minha resolução para iOS11, eu mudo a aparência de UIBarButtonItem em applicationDidFinishLaunchingWithOptions:
UIBarButtonItem.appearance().setBackButtonTitlePositionAdjustment(UIOffsetMake(-100, 0), for:UIBarMetrics.default)
Você não pode alterar o deslocamento Y, porque isso mudará a posição do botão da barra traseira também no iOS11, mas está OK no iOS10 e abaixo.
Em Swift3,
Se você definir uma configuração global
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
// ..
let BarButtonItemAppearance = UIBarButtonItem.appearance()
BarButtonItemAppearance.setTitleTextAttributes([NSForegroundColorAttributeName: UIColor.clear], for: .normal)
BarButtonItemAppearance.setTitleTextAttributes([NSForegroundColorAttributeName: UIColor.clear], for: .highlighted)
// ...
}
Swift 3.1 Você pode fazer isso implementando o método delegado de UINavigationController.
func navigationController(_ navigationController: UINavigationController,
willShow viewController: UIViewController, animated: Bool) {
/** It'll hide the Title with back button only,
** we'll still get the back arrow image and default functionality.
*/
let item = UIBarButtonItem(title: " ", style: .plain, target: nil,
action: nil)
viewController.navigationItem.backBarButtonItem = item
}
Para aqueles que desejam ocultar o título do botão Voltar globalmente.
Você pode swizzle viewDidLoad
de UIViewController
como esta.
+ (void)overrideBackButtonTitle {
NSError *error;
// I use `Aspects` for easier swizzling.
[UIViewController aspect_hookSelector:@selector(viewDidLoad)
withOptions:AspectPositionBefore
usingBlock:^(id<AspectInfo> aspectInfo)
{
UIViewController *vc = (UIViewController *)aspectInfo.instance;
// Check whether this class is my app's view controller or not.
// We don't want to override this for Apple's view controllers,
// or view controllers from external framework.
NSString *className = NSStringFromClass([vc class]);
Class class = [NSBundle.mainBundle classNamed:className];
if (!class) {
return;
}
UIBarButtonItem *backButton = [[UIBarButtonItem alloc] initWithTitle:@" " style:UIBarButtonItemStylePlain target:nil action:nil];
vc.navigationItem.backBarButtonItem = backButton;
} error:&error];
if (error) {
NSLog(@"%s error: %@", __FUNCTION__, error.localizedDescription);
}
}
Uso:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
[[self class] overrideBackButtonTitle];
return YES;
}
Se você tem como alvo o iOS 13 e posterior, pode usar esta nova API para ocultar o título do botão Voltar globalmente .
let backButtonAppearance = UIBarButtonItemAppearance()
backButtonAppearance.normal.titleTextAttributes = [.foregroundColor: UIColor.clear]
UINavigationBar.appearance().standardAppearance.backButtonAppearance = backButtonAppearance
UINavigationBar.appearance().compactAppearance.backButtonAppearance = backButtonAppearance
UINavigationBar.appearance().scrollEdgeAppearance.backButtonAppearance = backButtonAppearance
Eu estava lutando com isso porque tinha um controlador de navegação personalizado. Consegui remover o texto do item anterior em todos os controladores de visualização com este código na minha classe de controlador de navegação personalizado
override func viewDidLayoutSubviews() {
self.navigationBar.backItem?.title = ""
}
Isso remove todos os títulos dos itens anteriores usando este controlador de navegação personalizado.
No iOS 11, descobrimos que definir UIBarButtonItem
a fonte / cor do texto da aparência para um valor muito pequeno ou cor clara fará com que outro item da barra desapareça (o sistema não honra mais a classe do item UIBarButton, ele irá convertê-lo para a _UIModernBarButton
). Além disso, definir o deslocamento do texto de volta para fora da tela resultará em flash durante o pop interativo.
Então, nós swizzled addSubView
:
+ (void)load {
if (@available(iOS 11, *)) {
[NSClassFromString(@"_UIBackButtonContainerView") jr_swizzleMethod:@selector(addSubview:) withMethod:@selector(MyiOS11BackButtonNoTextTrick_addSubview:) error:nil];
}
}
- (void)MyiOS11BackButtonNoTextTrick_addSubview:(UIView *)view {
view.alpha = 0;
if ([view isKindOfClass:[UIButton class]]) {
UIButton *button = (id)view;
[button setTitle:@" " forState:UIControlStateNormal];
}
[self MyiOS11BackButtonNoTextTrick_addSubview:view];
}
-(void)setNavigationItems{
UIBarButtonItem *leftBarButtonItem=[[UIBarButtonItem alloc]initWithTitle:@"**Your title here**" style:UIBarButtonItemStyleBordered target:self action:@selector(backButtonClicked)];
self.navigationController.navigationBar.topItem.backBarButtonItem=leftBarButtonItem;
}
-(void)backButtonClicked{
[self.navigationController popViewControllerAnimated:YES];
}
O texto de volta vem do último View Controller navigationItem.title
, e navigationItem.title
é definido automaticamente por self.title
. Uma maneira fácil de resolver o problema é o gancho setTitle:
, certifique-senavigationItem.title = @""
Coloque este código em AppDelegate.m
fará com que fique ok。
[UIViewController aspect_hookSelector:@selector(setTitle:)
withOptions:AspectPositionAfter
usingBlock:^(id<AspectInfo> aspectInfo, NSString *title) {
UIViewController *vc = aspectInfo.instance;
vc.navigationItem.titleView = ({
UILabel *titleLabel = [[UILabel alloc] initWithFrame:CGRectZero];
titleLabel.font = [UIFont preferredFontForTextStyle:UIFontTextStyleHeadline];
titleLabel.text = title;
titleLabel;
});
vc.navigationItem.title = @"";
} error:NULL];
Mais detalhes em https://www.jianshu.com/p/071bc50f1475(Simple Chinease)
Minha solução: - XCode: 10.2.1 - Swift: 5
XCode 11.5 Swift 5
Uma maneira muito simples - embora talvez um pouco hackeada - de fazer isso programaticamente se você não precisar do botão voltar personalizado é definir o tamanho da fonte igual a zero no controlador de visualização que você está empurrando para a pilha, chamando algo assim de viewDidLoad
private func setupNavBar() {
let appearance = UINavigationBarAppearance()
appearance.configureWithDefaultBackground()
let backButtonAppearance = UIBarButtonItemAppearance()
backButtonAppearance.normal.titleTextAttributes = [.font: UIFont(name: "Arial", size: 0)!]
appearance.backButtonAppearance = backButtonAppearance
navigationItem.standardAppearance = appearance
navigationItem.scrollEdgeAppearance = appearance
navigationItem.compactAppearance = appearance
}
Finalmente encontrei a solução perfeita para ocultar o texto de volta padrão em todo o aplicativo.
Basta adicionar uma imagem transparente e adicionar o código a seguir em seu AppDelegate.
UIBarButtonItem.appearance().setBackButtonBackgroundImage(#imageLiteral(resourceName: "transparent"), for: .normal, barMetrics: .default)
O método a seguir funciona no iOS 11 e é seguro para não travar em outras versões do iOS. Fazer isso pode fazer com que seu aplicativo seja rejeitado na revisão da App Store, pois UIModernBarButton e UIBackButtonContainerView são APIs privadas. Coloque em AppDelegate.
if
let UIModernBarButton = NSClassFromString("_UIModernBarButton") as? UIButton.Type,
let UIBackButtonContainerView = NSClassFromString("_UIBackButtonContainerView") as? UIView.Type {
let backButton = UIModernBarButton.appearance(whenContainedInInstancesOf: [UIBackButtonContainerView.self])
backButton.setTitleColor(.clear, for: .normal)
}
Versão Swift, funciona perfeitamente globalmente:
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
}
solution
. Como @limfinity apontou, ele irá alterá-lo universalmente para todos os UIBarButtonItem em todo o aplicativo