UINavigationBar botão voltar personalizado sem título

231

Como posso personalizar o botão voltar da navegação no iOS 7 e superior sem título? (ou seja, apenas com a seta)

self.navigationItem.leftBarButtonItem = self.editButtonItem;

Eu só estou querendo saber se eles têm algum self.backButtonItem;

OU

algo assim?

self.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc]
                   initWithBarButtonSystemItem:UIBarButtonSystemItemBACK 
                   target:self action:@selector(back)];
Kiddo
fonte
3
Você pode usar a propriedade resposta + barra de navegação tintColor @hiroshi fazer chevron com cor personalizada e sem quaisquer títulos
Dmitry Zhukov
Para quem possui uma barra de guias e não deseja o texto do botão Voltar, a correção é: na viewDidLoad () do TabBarController, coloque: self.navigationItem.backBarButtonItem = UIBarButtonItem (title: "", style:. planície, alvo: nil, ação: nil)
Borzh

Respostas:

313

É realmente muito fácil, aqui está o que eu faço:

Objetivo C

// Set this in every view controller so that the back button displays back instead of the root view controller name
self.navigationItem.backBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"" style:UIBarButtonItemStylePlain target:nil action:nil];

Swift 2

self.navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .Plain, target: nil, action: nil)

Swift 3

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

Coloque esta linha no controlador de exibição que está pressionando a pilha ( o controlador de exibição anterior ). O botão Voltar do controlador de exibição pressionado agora mostrará o que você colocou para initWithTitle, que neste caso é uma string vazia.

Kyle Begeman
fonte
3
Eu usei isso, mas o título vem e desaparece de forma animada ??
precisa saber é o seguinte
7
Obrigado Kyle! Eu estava procurando uma maneira de renomear o botão voltar padrão no iOS 7. Coloquei isso no meu prepareForSeguecontrolador de exibição e funcionou perfeitamente.
Yiwei
1
@ user1010819 Esse é o comportamento esperado, barButtonItems será animado dentro e fora ao alternar os controladores de exibição. O que você está tentando realizar?
Kyle Begeman
1
@YiweiGao Sem problemas! É apenas mais uma daquelas coisas que, se você souber o código certo, é bem simples! Fico feliz que ajudou!
Kyle Begeman
3
Eu sinto que isso precisa de uma atualização, apenas não mostra nada agora, a seta não está lá por padrão?
Mathijs Segers
198

Encontrei uma maneira fácil de fazer meu botão voltar com a seta única do iOS.

Vamos supor que você tenha um controlador de navegação indo para o ViewA do ViewB. No IB, selecione a barra de navegação do ViewA, você verá estas opções: Título, Prompt e Botão Voltar.

Opções de barra de navegação

ViewA navigate bar options

O truque é escolher o título do botão Voltar do controlador de visualização de destino (ViewB) nas opções do controlador de visualização anterior (Visualização A). Se você não preencher a opção "Botão Voltar", o iOS colocará o título "Voltar" automaticamente, com o título do controlador de exibição anterior . Portanto, você precisa preencher esta opção com um único espaço.

Preencha o espaço na opção "Botão Voltar"

Fill space in "Back Button" option

O resultado:

The Result:

Thomás Calmon
fonte
Bem-vindo ao Stack Overflow . Se você não tiver, dê uma olhada no que estamos turnê , e ler alguns dos artigos na central de ajuda sobre como trabalhamos e alguns dos costumes da comunidade aqui. Se você precisar de ajuda com as funções do site, não tenha medo de pesquisar, faça uma pergunta no Meta Stack Overflow (se você ainda não conseguiu encontrar uma resposta). Obrigado e boa sorte! De qualquer forma, você pode postar suas imagens agora ... :)
Qantas 94 Heavy
53
ele funciona, prestar atenção apenas - você precisa definir "o botão traseiro" para anterior controlador (por exemplo, para RootViewController em seu controlador de navegação)
evfemist
Verifique se você não tem "hidesBackButton" definido como TRUE no item de navegação em ViewA
shim
Parece-me que isso funciona se o título do controlador apresentador for longo o suficiente - se for um título curto, será usado.
Amgrein
1
para mim ele só funciona quando tanto a origem eo destino NavigationItem de ViewController já Back Buttondefinida para um caractere de espaço simples (ou seja, tanto viewa e viewB)
dcestari
72

Basta usar uma imagem!

OBJ-C :

- (void)viewDidLoad {
     [super viewDidLoad];
     UIBarButtonItem *backButton = [[UIBarButtonItem alloc] initWithImage:[UIImage imageNamed:@"Icon-Back"]
                                                                                        style:UIBarButtonItemStylePlain
                                                                                       target:self.navigationController
                                                                                       action:@selector(popViewControllerAnimated:)];
     self.navigationItem.leftBarButtonItem = backButton;
}

SWIFT 4 :

let backBTN = UIBarButtonItem(image: UIImage(named: "Back"), 
                              style: .plain, 
                              target: navigationController, 
                              action: #selector(UINavigationController.popViewController(animated:)))
navigationItem.leftBarButtonItem = backBTN
navigationController?.interactivePopGestureRecognizer?.delegate = self

Icon-Back.png

Icon-Back

[email protected]

Icon-Back@2x

[email protected]

Icon-Back@23x

mt81
fonte
4
Com esta solução, você parece perder a funcionalidade "deslizar para voltar".
J7nn7k
16
navigationController?.interactivePopGestureRecognizer?.delegate = selffaz o truque para manter o gesto de furto de volta
Victor Carmouze
Eu tenho procurado por esta resposta, talvez toda a minha vida, ou seja, o seletor de ação.
Des
29

O iOS7 possui novas regras de interface, portanto, é melhor manter pelo menos a seta para trás quando você pressiona um UIView. É muito fácil alterar o texto "voltar" programaticamente. Basta adicionar este código antes de enviar a visualização (ou prepareForSegue se você estiver usando o StoryBoards):

-(void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{
      self.navigationItem.backBarButtonItem=[[UIBarButtonItem alloc] initWithTitle:@"NEW TITLE" style:UIBarButtonItemStylePlain target:nil action:nil];
}

Isso alterará o texto "Voltar" padrão, mas manterá a seta para trás no estilo iOS7. Você também pode alterar a cor da tonalidade da seta para trás antes de empurrar a visualização:

- (void)viewDidLoad{
     //NavBar background color:
     self.navigationController.navigationBar.barTintColor=[UIColor redColor];
//NavBar tint color for elements:
     self.navigationController.navigationBar.tintColor=[UIColor whiteColor];
}

Espero que isso ajude você!

Anibal Itriago
fonte
2
Isso funciona muito bem e parece melhor do que as outras opções. Por exemplo, o título nunca precisa ser redefinido para o valor anterior, ao contrário de algumas das outras respostas.
pr1001
26

Nada do que você precisa fazer. Você pode conseguir o mesmo através do próprio storyboard.

Basta ir ao controlador de navegação raiz e dar um espaço. Lembre-se não do controlador que você queria no botão voltar sem título, mas do controlador de navegação raiz.

Conforme a imagem abaixo.  Isso funciona para iOS 7 e iOS 8

Swaroop S
fonte
Eu tentei, funciona. Mas ainda não consigo alterar o título no código.
Yu-Lin Wang
Trabalhou com XCode7, mas não funciona mais em xCode8 -> ios10.X, eu usei método @iwasrobbed
LucioB
Todo gênio é simples!
Illya Krit #
22

Embora a resposta de Kyle Begeman faça totalmente o truque, é bastante irritante ter esse código em todos os controladores de exibição possíveis. Acabei com uma UINavigationItemcategoria simples . Cuidado, aqui estão dragões! Desculpe, quero dizer, chiando:

#import <objc/runtime.h>

@implementation UINavigationItem (ArrowBackButton)

static char kArrowBackButtonKey;

+ (void)load {
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        Method m1 = class_getInstanceMethod(self, @selector(backBarButtonItem));
        Method m2 = class_getInstanceMethod(self, @selector(arrowBackButton_backBarButtonItem));
        method_exchangeImplementations(m1, m2);
    });
}

- (UIBarButtonItem *)arrowBackButton_backBarButtonItem {
    UIBarButtonItem *item = [self arrowBackButton_backBarButtonItem];
    if (item) {
        return item;
    }

    item = objc_getAssociatedObject(self, &kArrowBackButtonKey);
    if (!item) {
        item = [[UIBarButtonItem alloc] initWithTitle:@"" style:UIBarButtonItemStyleBordered target:nil action:NULL];
        objc_setAssociatedObject(self, &kArrowBackButtonKey, item, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
    }
    return item;
}

@end
secondcitysaint
fonte
1
I upvoted mas depois decidiu usar um hack simples em vez - [[UIBarButtonItem appearance] setBackButtonTitlePositionAdjustment:UIOffsetMake(-1000, -1000) forBarMetrics:UIBarMetricsDefault]; ( fonte ) - pode ser um pouco menos elegante, mas swizzling senti como um exagero
dmur
2
Sério, vocês ... não passam por nenhuma outra solução. Implemente a solução @nicky postada como uma categoria e não pense duas vezes. Esta é uma ótima solução reutilizável que pode ser implementada em todo o aplicativo se você adicionar esse arquivo Prefix.pch. A Apple incentiva o uso de categorias para adicionar Métodos às Classes Existentes. Você deve aproveitar isso sempre que possível.
Zmonteca
Esta é a melhor solução, na minha opinião, de qualquer maneira o "method_exchangeImplementation" é um pouco inseguro, dê uma olhada nisso: Maneira direita de swizzle e este NSHipster swizzling guia
Alessandro Orrù
@ AlessandroOrrù Nesse caso em particular, isso deve ser seguro, porque o método swizzled é UINavigationItemo método próprio, não há herança envolvida. E _cmdé muito improvável que ele esteja envolvido em um caso. Enfim, é um bom ponto. Então, se você tiver algum desses numerosos ajudantes de swizzling em seu projeto, use-o aqui também.
secondcitysaint 13/01
21

EDIT: 2014-04-09: À medida que ganhei reputação, sinto muito por não usar mais esse truque. Eu recomendo a resposta de Kyle. Também aviso que o selfde self.navigationItem.backBarButtonItemnão é o controlador de vista o botão Voltar é exibido, mas a vista do controlador anterior para ser voltou.

Se você não precisa ter o texto do título para o controlador de exibição anterior, basta preencher o título com uma string em branco;

self.navigationItem.title = @"";
[self.navigationController pushViewController:viewController animated:YES];

Isso impedirá a exibição de "retorno" com a chevron no controlador de exibição empurrado.

EDIT: Mesmo que você use texto de título que não esteja em branco, definir o título do controlador de exibição anterior em viewWillAppear:obras, exceto que o título pode piscar rapidamente quando o controlador de exibição foi exibido. Eu acho que "o aplicativo do twitter" parece fazer um hack mais sutil para evitar a cintilação.

hiroshi
fonte
O único problema que tive aqui foi que, ao pressionar a barra de navegação para voltar, o título na visualização anterior fica em branco. Alguma maneira de contornar isso?
Alioo
@Alioo Você tentou o que eu mencionei na linha "EDIT"?
quer
20

Isso funciona, mas removerá o título do item anterior, mesmo se você voltar para ele:

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

Basta definir essa propriedade no viewDidLoadView Controller enviado.

Guto Araujo
fonte
17
Isso removerá o título do item anterior, mesmo se você voltar a ele. Não é muito bom :(
Antzi 27/11
Defino o título do VC pressionando viewWillAppearpara que ele esteja sempre definido corretamente.
Guto Araujo 27/11
@GutoAraujo Funciona, mas o título reaparece com 1 ou 2 segundos de atraso, o que faz com que o UX não seja tão bom.
fuiiii 19/07/2014
Em xCode8 -> ios10.X esta parece ser a única maneira de resolver a questão
LucioB
12

É assim que eu faço e da maneira mais simples, funciona e mais clara para fazê-lo.

Isso funciona se incorporado em Navigation Controller

Swift 3

Em viewDidLoadadiciono isso ao View Controller, você deseja que o botão voltar seja apenas uma seta.

if let topItem = self.navigationController?.navigationBar.topItem {
   topItem.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)
}

A diferença disso para a resposta de @Kyle Begeman é que você chama isso no controlador de exibição que deseja que o botão voltar seja apenas uma seta, não no controlador de exibição de pilha de envio.

r_19
fonte
7

Você não tem acesso ao backButtonItem de navegação da maneira que deseja, precisa criar seu próprio botão Voltar, como abaixo:

- (void)loadView
{
    [super loadView];
    UIButton *backButton = [[UIButton alloc] initWithFrame: CGRectMake(0, 0, 44.0f, 30.0f)];
    [backButton setImage:[UIImage imageNamed:@"back.png"]  forState:UIControlStateNormal];
    [backButton addTarget:self action:@selector(popVC) forControlEvents:UIControlEventTouchUpInside];
    self.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc] initWithCustomView:backButton];
}

E claro:

- (void) popVC{
  [self.navigationController popViewControllerAnimated:YES];
}
Tarek Hallak
fonte
então nós perdemos o bom fade out animação aconteceu no botão de volta
Kiddo
3
Você precisa de uma máscara para transições suaves. "* Se você deseja usar uma imagem personalizada para substituir a divisa padrão, também precisa criar uma imagem de máscara personalizada. O iOS 7 usa a máscara para fazer com que o título da tela anterior pareça surgir da - ou desaparecer na - divisa durante a navegação transições ".
usuário
3
@ nulo você perderá o gesto de deslizar de lado a lado do iOS 7!
Mazen Kasser 31/10/2013
@user Recebo a imagem personalizada, mas a cor da tonalidade é azul por padrão. Como não consigo adicionar tonalidade? graças
Mazen Kasser
7

Alvo: personalizando o botão voltar tudoUINavigationBarpara um ícone branco

Etapas: 1. no método "didFinishLaunchingWithOptions" do AppDelete:

UIImage *backBtnIcon = [UIImage imageNamed:@"navBackBtn"];


if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"7.0")) {
    [UINavigationBar appearance].tintColor = [UIColor whiteColor];
    [UINavigationBar appearance].backIndicatorImage = backBtnIcon;
    [UINavigationBar appearance].backIndicatorTransitionMaskImage = backBtnIcon;
}else{

    UIImage *backButtonImage = [backBtnIcon resizableImageWithCapInsets:UIEdgeInsetsMake(0, backBtnIcon.size.width - 1, 0, 0)];
    [[UIBarButtonItem appearance] setBackButtonBackgroundImage:backButtonImage  forState:UIControlStateNormal barMetrics:UIBarMetricsDefault];

    [[UIBarButtonItem appearance] setBackButtonTitlePositionAdjustment:UIOffsetMake(0, -backButtonImage.size.height*2) forBarMetrics:UIBarMetricsDefault];
}

2.no viewDidLoadmétodo da superclasse comum ViewController:

 if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"7.0")) {
        UIBarButtonItem *backItem = [[UIBarButtonItem alloc] initWithTitle:@""
                                                                     style:UIBarButtonItemStylePlain
                                                                    target:nil
                                                                    action:nil];
        [self.navigationItem setBackBarButtonItem:backItem];
    }else{
        //do nothing
    }
Jagie
fonte
Isso mostra um aviso "Versão implícita do SYSTEM_VESION _..." é inválida no C99.
Jayprakash Dubey
7

SWIFT 4

Para aqueles que desejam criar botões de retorno personalizados e remover o título, use o seguinte trecho de código no controlador de exibição que está pressionando o novo:

self.navigationController?.navigationBar.backIndicatorImage = UIImage(named: "close")
self.navigationController?.navigationBar.backIndicatorTransitionMaskImage = UIImage(named: "close")
self.navigationItem?.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)

Para um uso mais universal, faça o seguinte:

  1. Crie uma função universal da seguinte maneira:

    func addCustomizedBackBtn(navigationController: UINavigationController?, navigationItem: UINavigationItem?) {
        navigationController?.navigationBar.backIndicatorImage = UIImage(named: "close")
        navigationController?.navigationBar.backIndicatorTransitionMaskImage = UIImage(named: "close")
        navigationItem?.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)
    }
  2. Em seguida, use-o nos controladores de exibição da seguinte maneira:

    addCustomizedBackBtn(navigationController: self.navigationController, navigationItem: self.navigationItem)
Nino Bouchedid
fonte
6

O hack simples do iOS6 também funciona no iOS7:

[UIBarButtonItem.appearance setBackButtonTitlePositionAdjustment:UIOffsetMake(0, -60) forBarMetrics:UIBarMetricsDefault];

Edit: Não use esse hack. Veja o comentário para obter detalhes.

zh.
fonte
6
Não use esse truque. Há um erro no código da Apple em dispositivos de 64 bits que impede que exibições modais apareçam quando você faz um deslocamento do título do botão de barra. Mais detalhes .
zh.
Bem, havia apenas problemas no dispositivo, não no simulador.
zh.
Esse hack não funciona mais quando criado com o Xcode 9 / iOS 11. O "<" parecerá muito baixo e você verá restrições quebradas quando executado no depurador.
T'Pol
3

Você pode usar isso. Isso funciona perfeitamente para mim, basta adicionar um UIButtoncomo uma exibição de custum para oUIBarButtonItem .

Experimente o código abaixo

    self.navigationItem.leftBarButtonItem=[self backButton];


- (UIBarButtonItem *)backButton
{
    UIImage *image = [UIImage imageNamed:@"back-btn.png"];
    CGRect buttonFrame = CGRectMake(0, 0, image.size.width, image.size.height);

    UIButton *button = [[UIButton alloc] initWithFrame:buttonFrame];
    [button addTarget:self action:@selector(backButtonPressed) forControlEvents:UIControlEventTouchUpInside];
    [button setImage:image forState:UIControlStateNormal];

    UIBarButtonItem *item= [[UIBarButtonItem alloc] initWithCustomView:button];

    return item;
}
Abhilash Reddy Kallepu
fonte
3
no entanto, isso desativará o gesto de deslizar para trás no iOS 7
user102008
3

Crie um UILabelcom o título desejado para o seu controlador de visualização raiz e atribua-o ao controlador de visualizaçãonavigationItem.titleView .

Agora defina o título como uma string vazia e o próximo controlador de exibição que você pressionar terá um botão voltar sem texto.

self.navigationItem.titleView = titleLabel; //Assuming you've created titleLabel above
self.title = @"";
rounak
fonte
3
 // add left bar button item

try this code:

- (void)viewDidLoad
{ 
    [super viewDidLoad];

   UIImage* image_back = [UIImage imageNamed:@"your_leftarrowImage.png"];
    CGRect backframe = CGRectMake(250, 9, 15,21);
    UIButton *backbutton = [[UIButton alloc] initWithFrame:backframe];
    [backbutton setBackgroundImage:image_back forState:UIControlStateNormal];
    [backbutton addTarget:self action:@selector(Btn_back:)
         forControlEvents:UIControlEventTouchUpInside];
    [backbutton setShowsTouchWhenHighlighted:YES];
    UIBarButtonItem *backbarbutton =[[UIBarButtonItem alloc] initWithCustomView:backbutton];
    self.navigationItem.leftBarButtonItem=backbarbutton;
    [backbutton release];

}
-(IBAction)Btn_back:(id)sender
{
    [self.navigationController popViewControllerAnimated:YES];

}
Paresh Hirpara
fonte
3

Todas as respostas não resolvem o problema. Não é aceitável definir o título do botão de retorno em todos os controladores de exibição e adicionar deslocamento ao título ainda faz o próximo título do controlador de exibição mudar para a direita.

Aqui está o método usando o método swizzling, basta criar uma nova extensão para UINavigationItem

import UIKit

extension UINavigationItem {
    public override class func initialize() {

    struct Static {
        static var token: dispatch_once_t = 0
    }

    // make sure this isn't a subclass
    if self !== UINavigationItem.self {
        return
    }

    dispatch_once(&Static.token) {
        let originalSelector = Selector("backBarButtonItem")
        let swizzledSelector = #selector(UINavigationItem.noTitleBackBarButtonItem)

        let originalMethod = class_getInstanceMethod(self, originalSelector)
        let swizzledMethod = class_getInstanceMethod(self, swizzledSelector)

        let didAddMethod = class_addMethod(self, originalSelector, method_getImplementation(swizzledMethod), method_getTypeEncoding(swizzledMethod))

        if didAddMethod {
            class_replaceMethod(self, swizzledSelector, method_getImplementation(originalMethod), method_getTypeEncoding(originalMethod))
        } else {
            method_exchangeImplementations(originalMethod, swizzledMethod)
        }
    }
}

// MARK: - Method Swizzling

struct AssociatedKeys {
    static var ArrowBackButtonKey = "noTitleArrowBackButtonKey"
}

func noTitleBackBarButtonItem() -> UIBarButtonItem? {
    if let item = self.noTitleBackBarButtonItem() {
        return item
    }

    if let item = objc_getAssociatedObject(self, &AssociatedKeys.ArrowBackButtonKey) as? UIBarButtonItem {
        return item
    } else {
        let newItem = UIBarButtonItem(title: " ", style: UIBarButtonItemStyle.Plain, target: nil, action: nil)
        objc_setAssociatedObject(self, &AssociatedKeys.ArrowBackButtonKey, newItem as UIBarButtonItem?, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
        return newItem
    }
}
}
jakub wolanski
fonte
Coloque o botão voltar com a palavra voltar, funciona muito bem: self.navigationItem.backBarButtonItem.title = @ "Back";
Mike Zriel
Como assim, companheiro? A pergunta era sobre como remover o texto do botão Voltar?
jakub Wolanski
1
Muitos aplicativos e os aplicativos próprios da Apple dizem "<Voltar", por isso é bom manter o padrão. BigTakeAway e JustEat.
Mike Zriel
2

Eu apliquei o seguinte código no viewDidLoad e funciona:

  // this will set the back button title
self.navigationController.navigationBar.topItem.title = @"Test";

 // this line set the back button and default icon color  

//[[self.navigationController.navigationBar.subviews lastObject] setTintColor:[UIColor blackColor]];

this line change the back default icon to your custom icon
[[self.navigationController.navigationBar.subviews lastObject] setTintColor:[UIColor colorWithPatternImage:[UIImage imageNamed:@"menuicon"]]];

Só para atualizar eu uso o Vector Icon

Hajra Qamar
fonte
2

Você pode subclassificar UINavigationController, definir-se como delegado e definir backBarButtonItem no método delegate navigationController:willShowViewController:animated:

@interface Custom_NavigationController : UINavigationController <UINavigationControllerDelegate>

@end

@implementation Custom_NavigationController

- (void)viewDidLoad
{
    [super viewDidLoad];

    self.delegate = self;
}

#pragma mark - UINavigationControllerDelegate

- (void)navigationController:(UINavigationController *)navigationController     willShowViewController:(UIViewController *)viewController animated:(BOOL)animated
{
    viewController.navigationItem.backBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"" style:UIBarButtonItemStylePlain target:nil action:nil];
}

@end
Nate Potter
fonte
2

Retornar título vazio

UIBarButtonItem *backButton = [[UIBarButtonItem alloc] initWithTitle:@""  style:UIBarButtonItemStyleDone target:self action:@selector(handleBack:)];
[backButton setTintColor:Color_WHITE];
[self.navigationItem setBackBarButtonItem:backButton];

Alterar imagem anterior

 UIImage *backImg = [[UIImage imageNamed:@"ic_back_white"] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
[UINavigationBar appearance].backIndicatorImage = backImg;
[UINavigationBar appearance].backIndicatorTransitionMaskImage = backImg;
warriorg
fonte
1

Uso essa solução desde o iOS 5 ou mais, sem problemas. Eu criei uma função utilitária que chamo nos controladores de exibição. Você precisa fazer isso no viewDidLoad ou em qualquer outro ponto depois disso.

void updateBackButtonTextForViewController(UIViewController *viewController, NSString *text)
{
    if(! viewController.navigationItem.backBarButtonItem)
    {
        viewController.navigationItem.backBarButtonItem =
        [[UIBarButtonItem alloc] initWithTitle:text
                                         style:UIBarButtonItemStylePlain
                                        target:nil action:nil];
    }
    else
    {
        viewController.navigationItem.backBarButtonItem.title = text;
    }
}

Em alguns casos, o item de navegação já pode existir; em outros, ele precisa ser criado. Isso é responsável pelos dois casos sem mexer no título do item de navegação. Ele permite que você remova o título simplesmente passando @"".

Dima
fonte
1
Essa é a resposta correta. Sem truques. Isso é apenas o uso da API do iOS da maneira como deveria ser usada, para definir o título. Defina-o como @ "" para remover o título (testado e funciona bem).
n13
1

A única maneira que funcionou para mim foi:

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

ATUALIZAR:

Quando mudei o sinalizador de animação segue para true (era falso antes), a única maneira que funcionava para mim era:

navigationController?.navigationBar.topItem?.title = ""
Siamaster
fonte
1

Se você possui dois ViewController (FirstVC, SecondVC) incorporados no Navigation Controller e deseja que haja apenas uma seta para trás no SecondVC.

Você pode tentar isso No ViewDidLoad do FirstVC

override func viewDidLoad() {
    super.viewDidLoad()
    self.navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .Plain, target: nil, action: nil)
}

Então, quando você entrar no SecondVC, verá a única seta para trás

Yu-Lin Wang
fonte
1

Se você definir a tintColor Of NavigationBar, adicione uma imagem personalizada do botão voltar sem título, para que a cor da tonalidade reflita a cor da imagem. Por favor, siga este link de documentação da apple.

https://developer.apple.com/library/content/documentation/UserExperience/Conceptual/UIKitUICatalog/index.html#//apple_ref/doc/uid/TP40012857-UIView-SW7

UINavigationItem *navItem = [[UINavigationItem alloc] init];
   navBar.tintColor = self.tintColor;

   UIImage *myImage = [UIImage imageNamed:@"left_arrow.png"];
     myImage = [myImage              imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate];

     UIBarButtonItem *leftButton = [[UIBarButtonItem alloc] initWithImage:myImage style:UIBarButtonItemStylePlain target:self action:@selector(cancelButtonFunction:)];
     navItem.leftBarButtonItem = leftButton;

    navBar.items = @[ navItem ];
Nazish Ali
fonte
1

Escrevi uma extensão para facilitar isso:

extension UIViewController {

    /// Convenience for setting the back button, which will be used on any view controller that this one pushes onto the stack
    @objc var backButtonTitle: String? {
        get {
            return navigationItem.backBarButtonItem?.title
        }
        set {
            if let existingBackBarButtonItem = navigationItem.backBarButtonItem {
                existingBackBarButtonItem.title = newValue
            }
            else {
                let newNavigationItem = UIBarButtonItem(title: newValue, style:.plain, target: nil, action: nil)
                navigationItem.backBarButtonItem = newNavigationItem
            }
        }
    }

}
Mark Bridges
fonte
1

Você pode alterar o título para @ "" do ViewController atual em viewWillDisappear e, quando estiver prestes a aparecer novamente, redefina o título para o que estava antes.

-(void) viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];
    self.title = @"Previous Title";
}

-(void) viewWillDisappear:(BOOL)animated {
    [super viewWillDisappear:animated];
    self.title = @"";
}
WaleedAmmari
fonte
0

No método prepareForSegue: do seu primeiro ViewController, você define esse título para @ ""; portanto, quando a próxima exibição for pressionada, ele exibirá o título anterior do ViewController, que será @ "".

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{
    self.navigationItem.title = @" ";
}

O único problema com isso é que, quando você pressiona o botão voltar, sua visualização anterior não possui título, portanto, você pode adicioná-lo novamente em viewWillAppear:

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

Não gosto muito desta solução, mas funciona e não encontrei outra maneira de fazê-lo.

Alejandro Figueroa
fonte
Veja minha resposta para a solução correta sem mexer no título do item de navegação.
Dima
Sua solução mantém a seta traseira do iOS7? Eu tentei algo semelhante, mas ele removeu a flecha.
Alejandro Figueroa
Ele mantém a seta para trás no iOS 7, sim. No iOS 6 passando em um espaço em branco (0 comprimento) corda também irá remover o botão completamente, porém, assim que esta fazendo isso só é realmente bom para iOS 7.
Dima
Existe uma solução muito simples. Veja se minha resposta funciona para você.
Guto Araujo 9/11
0

Para adicionar à resposta de Thomas C acima, às vezes colocar um único espaço não funciona e você deve continuar adicionando espaços.

botão de barra vazia

Você saberá que obteve sucesso quando vir "Item do botão de barra -" sob o "Item de navegação". Está no Esboço do Documento (Editor-> Mostrar Esboço do Documento). Depois de ver a imagem acima, você pode excluir alguns espaços e ver se ela ainda funciona.

Rog182
fonte
0
- (id)initWithCoder:(NSCoder *)aDecoder
{
    self = [super initWithCoder:aDecoder];
    if (self) {
        // Custom initialization
        self.navigationItem.backBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"" style:UIBarButtonItemStylePlain target:nil action:nil];

    }
    return self; 
}

Assim como Kyle Begeman, você adiciona o código acima no seu controlador de visualização raiz. Todo o sub-controlador de visão será aplicado. Além disso, adicionando isso no método initWithCoder:, você pode aplicar o estilo para controladores de exibição raiz nas abordagens baseadas em xib, storyboard ou código.

Chris So
fonte