Come nascondere il pulsante "indietro" in UINavigationController?


158

Sai come nascondere il pulsante 'indietro' in un UINavigationController? Inoltre, come mostrarlo indietro, ma immagino sia molto simile a nasconderlo ...

Proprio come fa l'applicazione di posta su iPhone quando si preme 'Modifica' durante la visualizzazione di e-mail.

Risposte:


313

Ho appena scoperto la risposta, in un controller usa questo:

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

E per ripristinarlo:

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

-

[AGGIORNARE]

Swift 3.0:

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

18
Impara anche dal mio errore: devi chiamare setHidesBackButton:PRIMA di spingere il NavigationItem nel navigationController.
codingFriend1

perché prima? che dire se si desidera premere un viewController e quindi nascondere il pulsante Indietro per impedire all'utente di tornare indietro?
user4951,

1
@codingFriend - Trovo che funzioni anche se metti setHidesBackButton nel gestore di messaggi viewDidAppear della vista su cui non vuoi mostrare il backbutton.
Anon,

2
I migliori eventi per questo sono viewWillAppear:animatednasconderlo e viewWillDisappear:animatedripristinarlo.
Pechar,

Finalmente qualcosa che Apple non ha cambiato in Xcode. Più di 5 anni dopo e questa risposta funziona ancora alla grande.
App Dev Guy

27

Aggiungi questo codice

[self.navigationItem setHidesBackButton:YES];

22

Oltre a rimuovere il pulsante Indietro (utilizzando i metodi già consigliati), non dimenticare che l'utente può ancora "passare" alla schermata precedente con un gesto di scorrimento da sinistra a destra in iOS 7 e versioni successive.

Per disabilitarlo (quando appropriato), implementare quanto segue (ad esempio in viewDidLoad):

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

1
Matt: +1 per te. Grazie per aver aggiunto questa nota. Molto utile. Per chiunque si stia chiedendo come funzioni il gesto pop, basta scorrere da sinistra a destra sulla barra di navigazione per ricreare ciò che Matt sta descrivendo qui. L'aggiunta del codice precedente impedisce all'utente di farlo sul controller di visualizzazione in cui è incluso.
Noobzilla,

18

Giusto per chiarire le risposte esistenti: la hidesBackButtonproprietà è la risposta giusta, ma non è chiaro in molte risposte a cosa si selfriferisca. Fondamentalmente dovresti impostare self.navigationItem.hidesBackButton = YESnel controller di visualizzazione che sta per essere spinto (o semplicemente spinto) sul UINavigationController.

In altre parole, dire che ho un UINavigationControllernome myNavController. Voglio dare una nuova visione, e quando lo faccio non voglio più mostrare il pulsante Indietro. Potrei fare qualcosa del tipo:

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];

Al termine del codice, la vista controllata da newVCdovrebbe ora essere visualizzata e nessun pulsante Indietro dovrebbe essere visibile.


Esattamente quello di cui avevo bisogno mentre stavo facendo NavigationController.NavigationItem. Grazie Matt.
Chucky,

16

Per nascondere e mostrare il pulsante Indietro in modo condizionale puoi usare il seguente codice:

-(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: in alcuni casi, è necessario inserirlo nel metodo viewDidAppear anziché viewWillAppear in casi come questi: quando si aggiorna l'array della classe successiva nella classe precedente e quindi si verifica la condizione nella classe successiva come sopra.


11

Swift iOS (ho usato il seguente)

// 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 non ha funzionato per me per qualche motivo

Ho usato in questo modo ->

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

grazie .. Ho avuto lo stesso problema in cui setHidesBackButton: SÌ non ha funzionato. ma questa soluzione ha funzionato per iOS 7.
mohsinj


6

Nel mio caso ho avuto alcuni problemi con le risposte attuali:

  • inside viewDidLoad / viewWillAppear solo l'icona back era nascosta e la stringa "Back" era inattiva ma ancora visibile
  • inside viewDidAppear Il pulsante Indietro è scomparso ... ma non volevo che l'utente lo vedesse affatto

Quindi la soluzione che finalmente ha funzionato per me è:

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

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

    return self;
}

3

La soluzione suggerita da Zoran Simic non ha funzionato per me per qualche motivo.

Questo codice ha funzionato comunque:

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

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

[controller release];

Ovviamente dovresti manipolare un NSArray secondo i tuoi gusti per farlo funzionare per te. Spero che aiuti qualcuno :)


Grazie per questo! Stavo combattendo un bug strano e questo ha funzionato. Non per tutti, ma utile nei casi giusti.
Brandon,

1

Nella mia sottoclasse UIViewController ho questo metodo:

-(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

Questo nasconde il pulsante Indietro e lo sostituisce con un pulsante Aggiungi in 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.

Generalmente, dovresti usare l'API per-ViewController di Apple come descritto molte volte già in questa pagina, ma a volte hai bisogno del controllo immediato del pulsante Indietro.

Il codice seguente nasconde il pulsante Indietro e garantisce che il rilevamento delle collisioni di tocco non avvenga nell'area dei pulsanti nascosti.

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

0

Questo nasconde il pulsante Indietro

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


navigationItem.leftBarButtonItem = backBtn
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.