Como ocultar o botão "voltar" no UINavigationController?


158

Você sabe como ocultar o botão 'voltar' em um UINavigationController? Além disso, como mostrá-lo de volta, mas acho que é muito semelhante a escondê-lo ...

Assim como o aplicativo de e-mail no iPhone quando você pressiona 'Editar' enquanto visualiza e-mails.

Respostas:


313

Acabei de descobrir a resposta, em um controlador use este:

[self.navigationItem setHidesBackButton:YES animated:YES];

E para restaurá-lo:

[self.navigationItem setHidesBackButton:NO animated:YES];

-

[ATUALIZAR]

Swift 3.0:

self.navigationItem.setHidesBackButton(true, animated:true)

18
Aprenda também com o meu erro: você deve ligar setHidesBackButton:ANTES de inserir o item de navegação no controlador de navegação.
codingFriend1

porque antes? e se você quiser pressionar um viewController e ocultar o botão Voltar para impedir que o usuário volte?
user4951

1
@codingFriend - Acho que isso também funciona se você colocar o setHidesBackButton no manipulador de mensagens viewDidAppear da exibição em que você não deseja exibir o botão de retorno.
Anon

2
Os melhores eventos para isso são viewWillAppear:animatedocultar e viewWillDisappear:animatedrestaurá-lo.
Pechar

Finalmente, algo que a Apple não mudou no Xcode. Mais de 5 anos depois, e essa resposta ainda funciona muito bem.
App Dev Guy

27

Adicione este código

[self.navigationItem setHidesBackButton:YES];

22

Além de remover o botão Voltar (usando os métodos já recomendados), não esqueça que o usuário ainda pode 'pop' na tela anterior com um gesto de deslizar da esquerda para a direita no iOS 7 e posterior.

Para desativar isso (quando apropriado), implemente o seguinte (em viewDidLoad, por exemplo):

 if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0)
     self.navigationController.interactivePopGestureRecognizer.enabled = NO;

1
Matt - +1 para você.Obrigado por adicionar esta nota. Muito útil. Para quem está se perguntando como o gesto pop funciona, basta deslizar da esquerda para a direita na barra de navegação para recriar o que Matt está descrevendo aqui. A adição do código acima impede que o usuário faça isso no controlador de exibição em que está incluído.
Noobzilla

18

Apenas para esclarecer as respostas existentes: a hidesBackButtonpropriedade é a resposta certa, mas em muitas respostas não está claro o que selfse refere. Basicamente, você deve configurar self.navigationItem.hidesBackButton = YESo controlador de exibição que está prestes a ser empurrado (ou acabou de ser empurrado) para o UINavigationController.

Em outras palavras, diga que eu tenho um UINavigationControllernome myNavController. Quero colocar uma nova visão e, quando o fizer, não quero mais o botão Voltar. Eu poderia fazer algo como:

UIViewController *newVC = [[UIViewController alloc] init];
//presumably would do some stuff here to set up the new view controller
newVC.navigationItem.hidesBackButton = YES;
[myNavController pushViewController:newVC animated:YES];

Quando o código terminar, a visualização controlada por newVCdeve aparecer agora e nenhum botão Voltar deve estar visível.


Exatamente o que eu precisava enquanto fazia NavigationController.NavigationItem. Obrigado Matt.
Chucky

16

Para ocultar e mostrar o botão Voltar condicionalmente, você pode usar o seguinte código:

-(void)viewDidAppear:(BOOL)animated
{
    if ([tempAry count]==0)
    {
        [self.navigationItem setHidesBackButton:YES animated:YES];
    }
    else
    {
        [self.navigationItem setHidesBackButton:NO animated:YES];
    }
    [super viewDidAppear:animated];
} 

Nota: em alguns casos, você deve colocá-lo no método viewDidAppear, em vez de viewWillApp, em casos como: quando você está atualizando a matriz da próxima classe para a classe anterior e depois verificando a condição na próxima classe, como acima.


11

IOS Swift (usei a seguir)

// hide back button
        self.navigationItem.setHidesBackButton(true, animated: false)

// pgrm mark ----- ------

    // hide the back button for this view controller

    override func setEditing(editing: Bool, animated: Bool) {
        super.setEditing(editing, animated: animated)

        self.navigationItem.setHidesBackButton(editing, animated: animated)

    }// end setEditing

10

sethidesbackbutton não funcionou para mim por algum motivo

Eu usei assim ->

self.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc] initWithCustomView:[[UIView alloc]initWithFrame:CGRectMake(0, 0, 20, 30)]] ;

obrigado .. Eu tive o mesmo problema em que setHidesBackButton: SIM não funcionou. mas esta solução funcionou para iOS 7.
mohsinj


6

No meu caso, tive alguns problemas com as respostas atuais:

  • inside viewDidLoad / viewWillAppear O único ícone de volta estava oculto e a string "Voltar" estava inativa, mas ainda visível
  • dentro do viewDidAppear o botão voltar desapareceu ... mas eu não queria que o usuário o visse

Portanto, a solução que finalmente funcionou para mim é:

- (id)initWithCoder:(NSCoder *)aDecoder {
    self = [super initWithCoder:aDecoder];

    if (self) {
        [self.navigationItem setHidesBackButton:YES animated:NO];
    }

    return self;
}

3

A solução sugerida por Zoran Simic não funcionou para mim por algum motivo.

Este código funcionou no entanto:

MyController* controller   =   [[MyController alloc]  init];
NSArray* array             =   [[[NSArray alloc] initWithObjects:controller, nil] autorelease];

[self.navigationController setViewControllers:array animated:NO];

[controller release];

Obviamente, você teria que manipular um NSArray ao seu gosto para fazê-lo funcionar para você. Espero que ajude alguém :)


Obrigado por isso! Eu estava lutando contra um bug estranho e isso fez o truque. Não é para todos, mas é útil nos casos certos.
Brandon

1

Na minha subclasse UIViewController, tenho este método:

-(void)setEditing:(BOOL)editing animated:(BOOL)animated {
    [super setEditing:editing animated: animated];

    // hide back button in edit mode
    [self.navigationItem setHidesBackButton:editing animated:YES];
}

0

Isso oculta o botão Voltar e o substitui por um botão Adicionar no Swift:

override func setEditing(_ editing: Bool, animated: Bool) {
    super.setEditing(editing, animated: animated)

    // This hides the back button while in editing mode, which makes room for an add item button
    self.navigationItem.setHidesBackButton(editing, animated: animated)

    if editing {
        // This adds the add item button
        let addButton = UIBarButtonItem(barButtonSystemItem: .add, target: self, action: #selector(addTapped))
        // Use the animated setter for the left button so that add button fades in while the back button fades out
        self.navigationItem.setLeftBarButton(addButton, animated: animated)
        self.enableBackGesture(enabled: false)
    } else {
        // This removes the add item button
        self.navigationItem.setLeftBarButton(nil, animated: animated)
        self.enableBackGesture(enabled: true)
    }
}

func enableBackGesture(enabled: Bool) {
    // In addition to removing the back button and adding the add item button while in edit mode, the user can still exit to the previous screen with a left-to-right swipe gesture in iOS 7 and later. This code disables this action while in edit mode.
    if let navigationController = self.navigationController {
        if let interactivePopGestureRecognizer = navigationController.interactivePopGestureRecognizer {
            interactivePopGestureRecognizer.isEnabled = enabled
        }
    }
}

0

Swift 3.

Geralmente, você deve usar a API per-ViewController da Apple, conforme descrito muitas vezes já nesta página, mas às vezes você precisa de controle imediato do botão Voltar.

O código a seguir oculta o botão Voltar e garante que a detecção de colisão de toque não ocorra na região do botão oculto.

let emptyView = UIView(frame: .zero)
self.navigationItem.leftBarButtonItem = UIBarButtonItem(customView: emptyView)

0

Isso oculta o botão Voltar

let backBtn = UIBarButtonItem(title: "", style: UIBarButtonItemStyle.plain, target: navigationController, action: nil)


navigationItem.leftBarButtonItem = backBtn
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.