Suppression du titre d'un iOS UIBarButtonItem

ce que je voulais faire , c'est supprimer le texte du bouton" Back "d'un UIBarButtonItem , en ne laissant que le chevron bleu sur la barre de navigation. Gardez à l'esprit que je développe pour iOS 7. J'ai essayé plusieurs méthodes, y compris, mais pas limité à:

C'est la méthode de l'image, que je n'aime pas (l'image semblait hors de propos):

UIBarButtonItem *barBtnItem = [[UIBarButtonItem alloc]initWithImage:[UIImage imageNamed:@"iOS7BackButton"] style:UIBarButtonItemStylePlain target:self action:@selector(goToPrevious:)];
self.navigationItem.leftBarButtonItem = barBtnItem;

une autre méthode que j'ai essayé était celle-ci, qui n'a tout simplement pas fonctionné (rien n'a été affiché):

UIBarButtonItem *barBtn = [[UIBarButtonItem alloc]init];
barBtn.title=@"";
self.navigationItem.leftBarButtonItem=barBtn;

ce que je voulais réaliser est quelque chose comme les boutons arrière trouvés dans l'application de musique iOS 7, qui ne comportait qu'un seul chevron.

Merci.

192
demandé sur Suragch 2013-09-29 18:09:37

30 réponses

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

ensuite, vous pouvez supprimer le titre de l'élément de bouton arrière.

si vous utilisez Storyboard, vous pouvez définir les attributs de navigation inspecteur bouton arrière avec l'espace.

201
répondu andyleehao 2016-10-28 19:56:04

pour régler le titre du bouton arrière d'un contrôleur de vue sans changer son titre utilisation:

Objectif-C:

self.navigationItem.backBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"" style:self.navigationItem.backBarButtonItem.style target:nil action:nil];

Swift:

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

pour être clair, ceci est fait sur le contrôleur de vue que vous verriez si vous appuyez sur le bouton arrière. c'est-à-dire qu'au lieu de voir '< Settings' vous voulez juste voir '<' alors sur votre SettingsViewController vous le mettriez dans votre init . Puis vous ne recevez aucun des problèmes du titre ne montrant pas quand vous regardez le contrôleur de vue lui-même.

402
répondu DonnaLea 2016-11-26 16:08:41

si vous utilisez des Storyboards, vous pouvez aller à Attributes Inspector du ViewController Navigation Item (cliquez sur Navigation Bar ) et définir la Back Button propriété à "" (un caractère d'espace). Cela positionnera le titre du bouton arrière sur un caractère d'espace, laissant le chevron visible. Pas besoin de jouer avec le code.

example image

notez que cela mettra Back Button titre pour le bouton arrière qui va suivre à cette Visualisez le contrôleur à partir de celui qui a été poussé dessus, pas pour le Back Button qui sera affiché à l'intérieur de ce contrôleur!

126
répondu Nikita Kukushkin 2018-07-27 09:48:44

cela fonctionne pour moi d'afficher juste le chevron "arrière" sans aucun texte:

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

définit cette propriété dans viewDidLoad du contrôleur de vue présentant la barre de navigation et il fera l'affaire.

Note: Je ne l'ai testé que dans iOS 7, ce qui est dans le cadre de la question.

122
répondu Guto Araujo 2013-11-18 13:17:24

lorsque vous définissez le titre du bouton, utilisez @ " au lieu de @"".

-- EDIT--

est-ce que quelque chose change quand vous essayez d'autres cordes? J'utilise moi-même le code suivant avec succès:

UIBarButtonItem *backButton = [[UIBarButtonItem alloc] initWithTitle:backString style:UIBarButtonItemStyleDone target:nil action:nil];
[[self navigationItem] setBackBarButtonItem:backButton];

backString est une variable qui est définie à @ ""ou @ "Back", selon que je suis sur iOS 7 ou une version inférieure.

une chose à noter est que ce code n'est pas dans le contrôleur pour la page que je veux personnaliser le bouton retour pour. Il est en fait dans le contrôleur avant sur la pile de navigation.

27
répondu Kamaros 2013-09-30 11:37:55

enter image description here

il est Parfois utile de voir les choses dans leur contexte. Voici un projet minimal qui cache le texte "back" mais qui montre quand même la flèche.

Storyboard

enter image description here

il y a une séquence de show à partir du bouton" Show Second View Controller " vers le contrôleur de second view.

j'ai aussi ajouté un élément de Navigation au contrôleur de deuxième vue pour qu'il ait un titre. Cette option est facultative. Il n'a pas d'incidence sur le bouton retour.

Code

First ViewController.swift

import UIKit
class FirstViewController: UIViewController {

    @IBAction func showSecondViewControllerButtonTapped(sender: UIButton) {

        // hide the back button text
        navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)
    }
}

SecondViewController.swift

import UIKit
class SecondViewController: UIViewController {
    // Nothing at all needed here
}

méthode alternative (IB seulement, pas de code)

sur le storyboard sélectionnez l'élément de navigation pour le premier voir contrôleur (pas le deuxième). Entrez juste un espace pour le texte du bouton de retour.

enter image description here

24
répondu Suragch 2017-12-01 07:31:15
self.navigationController.navigationBar.topItem.title = @"";
15
répondu Claudio Castro 2015-08-05 22:09:16

sur iOS7, Apple a introduit deux nouvelles propriétés à UINavigationBar, "backIndicatorTransitionMaskImage" et "backIndicatorImage".

en appelant une seule fois:

[[UINavigationBar appearance] setBackIndicatorImage:[UIImage imageNamed:@"your_image"]];
[[UINavigationBar appearance] setBackIndicatorTransitionMaskImage:[UIImage imageNamed:@"your_image_mask"]];

il affichera une image personnalisée à la place du chevron glyph par défaut, héritant de la teinte de keyWindow.

et pour enlever le titre, Je suggérerai la réponse de Kamaros. Rappelez - vous d'appeler ce code sur le contrôleur de vue qui pousse votre nouveau contrôleur de vue. suppression du titre d'un iOS UIBarButtonItem

11
répondu DZenBot 2017-05-23 12:02:56

Je n'ai pas eu beaucoup de succès avec les réponses fournies, mais j'ai trouvé un travail vraiment simple autour. Dans votre storyboard, vous pouvez cliquer sur L'élément de Navigation de votre UIViewController et régler le texte du bouton back. Je l'ai mis dans un seul espace et il m'a donné le comportement que je cherchais. enter image description here

10
répondu Grahambo 2014-04-25 22:11:56

cela a fonctionné pour moi dans iOS10. Appelez cela depuis viewDidLoad du contrôleur de vue.

self.navigationController?.navigationBar.topItem?.title = ""
10
répondu Ravi 2017-05-26 09:10:58

la solution Simple à ce problème, en travaillant sur iOS7 ainsi que 6, est de définir custom title view dans viewDidLoad:

- (void)viewDidLoad {

    [super viewDidLoad];

    UILabel *titleLabel = [[UILabel alloc] initWithFrame:CGRectZero];
    titleLabel.text = self.title;
    titleLabel.backgroundColor = [UIColor clearColor];

    [titleLabel sizeToFit];

    self.navigationItem.titleView = titleLabel;
}

puis, dans viewWillAppear: vous pouvez appeler en toute sécurité

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

parce que votre vue titre est une vue personnalisée, elle ne sera pas écrasée lorsque vous reviendrez dans la pile de navigation.

6
répondu Matthes 2013-12-06 09:01:39

en fait, vous pouvez le faire avec juste un tour:

remplacer UINavigationBar classe et ajouter cette ligne de code:

- (void)layoutSubviews{
    self.backItem.title = @"";
    [super layoutSubviews];
}

alors initialisez votre UINavigationController avec cette classe personnalisée UINavigationBar.. etc. UINavigationController * navController = [[UINavigationController alloc] initWithNavigationBarClass:[CBCNavigationBar class] toolbarClass:nil];

Espérons que cette aide

6
répondu rordulu 2014-07-08 09:15:49

dans la prépareforsegue: méthode de votre premier ViewController, vous définissez le titre des vues à@"", de sorte que lorsque la prochaine vue est poussée il affichera le titre du ViewController précédent qui sera@"".

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

le seul problème avec ceci est que lorsque vous appuyez sur le bouton arrière votre vue précédente n'aura pas de titre, donc vous pouvez l'ajouter à nouveau sur viewWillAppear:

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

je n'aime pas beaucoup cette solution, mais ça fonctionne et je n'ai pas trouver d'autre moyen de le faire.

5
répondu Alejandro Figueroa 2016-12-23 17:21:31

J'ai pu assembler quelque chose en utilisant la réponse de DonnaLea. C'est ainsi que la solution apparaît dans ma sous-classe UIViewController:

var backItemTitle:String?

override func viewDidLoad() {
    super.viewDidLoad()

    //store the original title
    backItemTitle = self.navigationController?.navigationBar.topItem?.title

    //remove the title for the back button
    navigationController?.navigationBar.topItem?.title = ""
}

override func willMoveToParentViewController(parent: UIViewController?) {
    super.willMoveToParentViewController(parent)
    if parent == nil {

        //restore the orignal title
        navigationController?.navigationBar.backItem?.title = backItemTitle
    }
}

le problème avec la réponse d'origine est qu'elle supprime le titre du contrôleur lorsque vous pop de nouveau à elle. Tenter de réinitialiser le titre dans viewWillDisappear est trop tard dans le processus de transition; il provoque le titre de revenir en arrière au lieu de bien animer. Cependant le willMoveToParentViewController arrive plus tôt et permet de corriger le comportement.

mise en garde: je l'ai seulement testé avec un push / pop UINavigationController normal. Il pourrait y avoir un comportement inattendu supplémentaire dans d'autres situations.

4
répondu BradB 2015-04-28 15:58:28

aucune des réponses ne m'a aidé. Mais un truc a fait - je viens d'enlever le titre du contrôleur de vue qui a poussé (où le bouton arrière va) juste avant de le pousser.

Ainsi, lorsque la vue précédente n'a pas de titre, sur iOS 7 le bouton Précédent n'aura qu'une flèche, sans texte.

Sur viewWillAppear de la poussée, j'ai remis le titre original.

3
répondu Kof 2013-10-16 12:56:46
    NSDictionary *attributes = [NSDictionary dictionaryWithObjectsAndKeys:
                                [UIColor clearColor],UITextAttributeTextColor,
                                nil];

    [[UIBarButtonItem appearance] setTitleTextAttributes:attributes
                                                forState:UIControlStateNormal];

j'avais le même problème et je l'ai fait de cette façon.

-- EDIT--

c'est une solution quand vous voulez vraiment supprimer le texte de titre de tous UIBarbuttonItem. Si vous voulez seulement supprimer le titre de l'article de barre de dos, il n'y a aucune solution pratique simple. Dans mon cas, puisque je n'ai que quelques UIBarButtonItems qui ont besoin de montrer le texte du titre, je viens de changer les titleTextAttributes de ces boutons spécifiques. Si vous voulez utilisez plus spécifiquement le code ci-dessous, qui ne changera que les boutons de barre de navigation:

NSDictionary *attributes = [NSDictionary dictionaryWithObjectsAndKeys:
                                [UIColor clearColor],UITextAttributeTextColor,
                                nil];

[[UIBarButtonItem appearanceWhenContainedIn:[UINavigationBar class], nil] setTitleTextAttributes:attributes
                                                forState:UIControlStateNormal];
3
répondu andylee 2014-02-11 15:34:20

la présente sous-classe navigationController supprime le"retour".

j'utilise ceci pour l'enlever, de façon permanente à travers l'application.

//.h
@interface OPCustomNavigationController : UINavigationController 

@end

//.m
@implementation OPCustomNavigationController

- (void)awakeFromNib
{
    [self backButtonUIOverride:YES];
}

- (void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated
{
    [self backButtonUIOverride:NO];

    [super pushViewController:viewController animated:animated];
}

- (void)backButtonUIOverride:(BOOL)isRoot
{
    if (!self.viewControllers.count)
        return;

    UIViewController *viewController;

    if (isRoot)
    {
        viewController = self.viewControllers.firstObject;
    }
    else
    {
        int previousIndex = self.viewControllers.count - 1;

        viewController = [self.viewControllers objectAtIndex:previousIndex];
    }

    viewController.navigationItem.backBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@""
                                                                                       style:UIBarButtonItemStylePlain
                                                                                      target:nil
                                                                                      action:nil];
}

@end
3
répondu 0yeoj 2015-10-14 02:03:38
[[UIBarButtonItem appearance] setBackButtonBackgroundImage:backButtonImage forState:UIControlStateNormal barMetrics:UIBarMetricsDefaultPrompt];
[[UIBarButtonItem appearance] setBackButtonTitlePositionAdjustment:UIOffsetMake(10.0, NSIntegerMin) forBarMetrics:UIBarMetricsDefault];
[[UIBarButtonItem appearance] setTitleTextAttributes:@{NSForegroundColorAttributeName:[UIColor whiteColor],
                                                               NSFontAttributeName:[UIFont systemFontOfSize:1]}
                                                    forState:UIControlStateNormal];
3
répondu Bill Xie 2015-10-28 10:07:41

SWIFT 3

navigationController?.navigationBar.topItem?.title = ""
3
répondu Jiří Zahálka 2017-05-26 09:10:44

Hide Back Button titre de la barre de Navigation

UIBarButtonItem *barButton = [[UIBarButtonItem alloc] init];
barButton.title = @""; // blank or any other title
self.navigationController.navigationBar.topItem.backBarButtonItem = barButton;
2
répondu Kirit Vaghela 2016-03-27 07:59:02

Voici ce que je fais moi, ce qui est plus simple pour supprimer le titre de bouton de retour

override func viewDidLoad() {
    super.viewDidLoad()
    navigationController?.navigationBar?.backItem?.title = ""
}
2
répondu YannickSteph 2016-10-19 09:42:03

Vous pouvez également utiliser ceci:

UIBarButtonItem *temporaryBarButtonItem = [[UIBarButtonItem alloc] init];
temporaryBarButtonItem.title = @"";
self.navigationItem.backBarButtonItem = temporaryBarButtonItem;

[temporaryBarButtonItem release];

Cela fonctionne pour moi

1
répondu Utkarsh 786 2014-05-15 13:57:35
case : <Back as <

override func viewWillAppear(animated: Bool) {
navigationController!.navigationBar.topItem!.title = ""
    }
1
répondu A.G 2015-09-18 07:21:01

solution Parfaite à l'échelle mondiale

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
}
1
répondu PeiweiChen 2016-03-31 02:44:32

je crée une classe personnalisée pour UINavigationController et l'applique à tous les contrôleurs de navigation dans mon application. À l'intérieur de cette custom UINavigationController classe I régler le UINavigationBar délégué à self une fois les charges de vue.

- (void)viewDidLoad {
    self.navigationBar.delegate = self;
}

puis je mets en œuvre la méthode du délégué:

- (BOOL)navigationBar:(UINavigationBar *)navigationBar shouldPushItem:(UINavigationItem *)item {

    // This will clear the title of the previous view controller
    // so the back button is always just a back chevron without a title
    if (self.viewControllers.count > 1) {
        UIViewController *previousViewController = [self.viewControllers objectAtIndex:(self.viewControllers.count - 2)];
        previousViewController.title = @"";
    }
    return YES;
}

de cette façon, j'assigne simplement ma classe personnalisée à tous mes contrôleurs de navigation et cela efface le titre de tous les boutons arrière. Et juste pour plus de clarté, j' toujours régler le titre de tous mes autres contrôleurs de vue à l'intérieur de viewWillAppear de sorte que le titre soit toujours mis à jour juste avant l'apparition de la vue (au cas où il serait supprimé par des trucs comme celui-ci).

1
répondu nurider 2016-04-19 15:54:42

si comme moi vous utilisez une vue personnalisée à la place du UINavigationBar et vous êtes coincé avec le bouton arrière alors vous devez faire un peu de travail qui se sent un peu cludgey.

[self.navigationController.navigationBar setHidden:NO];
self.navigationController.navigationBar.topItem.title = @"";
[self.navigationController.navigationBar setHidden:YES];

il semble que si elle n'est pas présentée alors peu importe ce qu'elle va essayer de montrer un titre, cela signifie qu'elle est montrée puis cachée avant qu'elle soit dessinée et résout le problème.

1
répondu Nicholas Smith 2017-05-12 22:33:04
extension UIViewController{
    func hideBackButton(){
        navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)
    }
}
1
répondu Maor 2017-06-27 10:46:45

dans iOS 11 Vous pouvez utiliser le code suivant pour cacher le titre du bouton Précédent:

Swift:

UIBarButtonItem.appearance().setTitleTextAttributes([ NSForegroundColorAttributeName : UIColor.clear ], for: .normal)
UIBarButtonItem.appearance().setTitleTextAttributes([ NSForegroundColorAttributeName : UIColor.clear ], for: .highlighted)

ce code ne supprime pas le titre de la barre de navigation, mais le rend juste transparent, le bouton de retour conserve encore de l'espace pour le titre. Si vous avez besoin d'avoir plus d'espace pour afficher le contrôleur de titre, alors vous devez utiliser une autre solution.

1
répondu Serhiy 2017-09-27 07:45:30

C'est une meilleure solution.

une autre solution est dangereuse parce qu'elle est bidon.

extension UINavigationController {

    func pushViewControllerWithoutBackButtonTitle(_ viewController: UIViewController, animated: Bool = true) {
        viewControllers.last?.navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)
        pushViewController(viewController, animated: animated)
    }
}
1
répondu taku_oka 2017-12-29 08:57:10

Swift 3.1 Vous pouvez le faire en implémentant la méthode delegate de UINavigationController. Il va cacher le titre avec le bouton de retour seulement, nous aurons toujours l'image de la flèche de retour et la fonctionnalité par défaut.

func navigationController(_ navigationController: UINavigationController, 
  willShow viewController: UIViewController, animated: Bool) {
        let item = UIBarButtonItem(title: " ", style: .plain, target: nil, 
                    action: nil)
        viewController.navigationItem.backBarButtonItem = item
    }
1
répondu S.M.Moinuddin. Shuvo 2018-07-10 16:11:37