Comment masquer le bouton «retour» dans UINavigationController?

158

Savez-vous comment masquer le bouton «retour» dans un UINavigationController? Aussi, comment le montrer, mais je suppose que c'est très similaire à le cacher ...

Tout comme l'application de messagerie sur l'iPhone lorsque vous cliquez sur `` Modifier '' lors de la visualisation des e-mails.

Zoran Simic
la source

Réponses:

313

Je viens de découvrir la réponse, dans un contrôleur, utilisez ceci:

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

Et pour le restaurer:

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

-

[METTRE À JOUR]

Swift 3.0:

self.navigationItem.setHidesBackButton(true, animated:true)
Zoran Simic
la source
18
Apprenez également de mon erreur: vous devez appeler setHidesBackButton:AVANT de pousser le navigationItem dans le navigationController.
codingFriend1
pourquoi avant? qu'en est-il si vous voulez pousser un viewController puis masquer le bouton de retour pour empêcher l'utilisateur de revenir en arrière?
user4951
1
@codingFriend - Je trouve que cela fonctionne également si vous placez le setHidesBackButton dans le gestionnaire de messages viewDidAppear de la vue sur laquelle vous ne souhaitez pas afficher le bouton arrière.
Anon
2
Les meilleurs événements pour cela sont viewWillAppear:animatedde le cacher et viewWillDisappear:animatedde le restaurer.
pechar
Enfin, quelque chose d'Apple n'a pas changé dans Xcode. Plus de 5 ans plus tard et cette réponse fonctionne toujours très bien.
App Dev Guy
27

Ajouter ce code

[self.navigationItem setHidesBackButton:YES];
visakh7
la source
22

En plus de supprimer le bouton de retour (en utilisant les méthodes déjà recommandées), n'oubliez pas que l'utilisateur peut toujours `` revenir '' à l'écran précédent avec un geste de balayage de gauche à droite dans iOS 7 et versions ultérieures.

Pour désactiver cela (le cas échéant), implémentez ce qui suit (dans viewDidLoad par exemple):

 if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0)
     self.navigationController.interactivePopGestureRecognizer.enabled = NO;
mattv123
la source
1
Matt - +1 pour vous.Merci d'avoir ajouté cette note. Très utile. Pour tous ceux qui se demandent comment fonctionne le geste pop, faites simplement glisser votre doigt de gauche à droite sur votre barre de navigation pour recréer ce que Matt décrit ici. L'ajout du code ci-dessus empêche l'utilisateur de le faire sur le contrôleur de vue où il est inclus.
noobzilla
18

Juste pour clarifier les réponses existantes: la hidesBackButtonpropriété est la bonne réponse, mais il n'est pas clair dans de nombreuses réponses à quoi se selfréfère. Fondamentalement, vous devez définir self.navigationItem.hidesBackButton = YESdans le contrôleur de vue qui est sur le point d'être poussé (ou qui vient d'être poussé) sur le UINavigationController.

En d'autres termes, disons que j'ai un UINavigationControllernom myNavController. Je veux mettre une nouvelle vue dessus, et quand je le fais, je ne veux plus que le bouton de retour s'affiche. Je pourrais faire quelque chose comme:

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

Lorsque le code est terminé, la vue contrôlée par newVCdoit maintenant être affichée et aucun bouton de retour ne doit être visible.

Mat
la source
Exactement ce dont j'avais besoin car je faisais pour la première fois NavigationController.NavigationItem. Merci Matt.
Chucky le
16

Pour masquer et afficher le bouton Retour de manière conditionnelle, vous pouvez utiliser le code suivant:

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

Remarque: dans certains cas, vous devez le mettre dans la méthode viewDidAppear au lieu de viewWillAppear, tels que: lorsque vous mettez à jour le tableau de la classe suivante dans la classe précédente, puis vérifiez la condition dans la classe suivante comme ci-dessus.

Sandip Patel - SM
la source
11

Swift iOS (j'ai utilisé suivant)

// 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
Vinod Joshi
la source
10

sethidesbackbutton n'a pas fonctionné pour moi pour une raison quelconque

J'ai utilisé de cette façon ->

self.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc] initWithCustomView:[[UIView alloc]initWithFrame:CGRectMake(0, 0, 20, 30)]] ;
M.Othman
la source
merci .. J'ai eu le même problème où setHidesBackButton: OUI n'a pas fonctionné. mais cette solution a fonctionné pour iOS 7.
mohsinj
6

Dans mon cas, j'ai eu quelques problèmes avec les réponses actuelles:

  • à l'intérieur de viewDidLoad / viewWillAppear seul l'icône de retour était masquée et la chaîne "Back" était inactive mais toujours visible
  • vue intérieureDidAppear le bouton de retour a disparu ... mais je ne voulais pas que l'utilisateur le voie du tout

La solution qui a finalement fonctionné pour moi est:

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

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

    return self;
}
micromanc3r
la source
3

La solution suggérée par Zoran Simic n'a pas fonctionné pour moi pour une raison quelconque.

Ce code a cependant fonctionné:

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

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

[controller release];

De toute évidence, vous devrez manipuler un NSArray à votre goût pour le faire fonctionner pour vous. J'espère que cela aide quelqu'un :)

PowerAktar
la source
Merci pour cela! Je combattais un bug étrange et cela a fait l'affaire. Pas pour tout le monde, mais utile dans les bons cas.
Brandon
1

Dans ma sous-classe UIViewController, j'ai cette méthode:

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

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

Cela masque le bouton de retour et le remplace par un bouton d'ajout dans 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
        }
    }
}
David Weiss
la source
0

Swift 3.

En règle générale, vous devez utiliser l'API per-ViewController d'Apple comme décrit plusieurs fois déjà sur cette page, mais vous avez parfois besoin d'un contrôle immédiat du bouton Retour.

Le code suivant masque le bouton Retour et garantit que la détection de collision de tap ne se produit pas dans la zone du bouton masqué.

let emptyView = UIView(frame: .zero)
self.navigationItem.leftBarButtonItem = UIBarButtonItem(customView: emptyView)
Womble
la source
0

Cela cache le bouton de retour

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


navigationItem.leftBarButtonItem = backBtn
Zeeshan
la source