Suppression du texte de titre d'un UIBarButtonItem iOS

198

Ce que je voulais faire, c'est supprimer le texte du bouton «Retour» 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 sans s'y limiter:

Ceci est la méthode d'image que je n'ai pas aimé (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ée est celle-ci, qui n'a tout simplement pas fonctionné (rien ne s'est affiché):

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

Ce que je voulais réaliser, c'est quelque chose comme les boutons de retour trouvés dans l'application iOS 7 Music, qui ne comportaient qu'un seul chevron.

Merci.

Pan Ziyue
la source
regardez cette réponse stackoverflow.com/a/20300577/1589731
ayalcinkaya
Pourquoi ne prenez-vous pas l'image de vos besoins? Et référez-le dans leftBarButtonItem.
Vishal Sharma
La raison pour laquelle je n'ai pas utilisé la méthode d'image est 1. Il est très difficile d'obtenir une image parfaite du bouton de retour et 2. Il y aura une certaine forme de désalignement avec l'image et cela ne semble pas naturel, et c'est pourquoi J'ai demandé à StackOverflow de l'aide pour savoir comment accomplir cela nativement.
Pan Ziyue du

Réponses:

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

Ensuite, vous pouvez supprimer le titre de l'élément du bouton Précédent.

Si vous utilisez Storyboard, vous pouvez définir le bouton Précédent de l'inspecteur des attributs de navigation avec de l'espace.

andyleehao
la source
95
Il y a un problème avec les gros titres: ils ne sont pas centrés mais poussés vers la droite, comme si le texte du bouton de retour était toujours là
sonxurxo
11
Cela ne fonctionne pas si l'utilisateur a activé "Accessibilité - Formes des boutons"
Mikael Bartlett
22
Je pense que c'est une meilleure réponse:[[UIBarButtonItem appearance] setTitleTextAttributes:@{NSForegroundColorAttributeName: [UIColor clearColor]} forState:UIControlStateNormal];
benjamin
19
Toute solution contenant des nombres magiques est une mauvaise idée. Avec la poussée vers la mise en page automatique, les classes de taille, les fonctionnalités d'accessibilité, etc., l'utilisation de valeurs constantes comme celle-ci ne manquera pas de vous mordre.
Michael Peterson
3
Pour améliorer le commentaire de benjamin, vous devez définir cela pour UIControlStateHighlightedainsi
n_b
411

Pour définir le titre du bouton de retour d'un contrôleur de vue sans modifier son titre, utilisez:

Objectif c:

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

Rapide:

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

Pour être clair, cela se fait sur le contrôleur de vue que vous verriez si vous appuyez sur le bouton de retour. c'est-à-dire qu'au lieu de voir '<Paramètres' vous voulez juste voir '<' alors sur votre SettingsViewController vous mettriez ceci dans votre init. Ensuite, vous n'obtenez aucun des problèmes du titre qui n'apparaît pas lorsque vous regardez le contrôleur de vue lui-même.

DonnaLea
la source
1
Je ne sais pas pourquoi l'autre réponse est marquée comme correcte, il suffit de supprimer le titre pour que le bouton de retour ait un "titre" à afficher, mais ce n'est pas du tout la bonne approche! Celui-ci devrait être la bonne réponse.
Pach
8
Pour tous ceux qui utilisent Swift, c'est navigationItem.backBarButtonItem = UIBarButtonItem (title: "", style: .Plain, target: nil, action: nil). Pas difficile de convertir Obj-C en Swift, mais je vous
éviterai les ennuis
15
@BenjaminPiette appelez-vous cela sur le UIViewController que vous verriez si vous appuyez sur le bouton de retour? Pas l'UIViewController qui affiche le bouton de retour.
DonnaLea
2
Quelle élégante solution! Merci. Cela ne me semblait pas juste de faire la chose offset.
hyd00
2
cette solution fonctionne parfaitement si vous écrivez cette ligne de code sur le contrôleur précédent dans la pile de navigation.
Bohdan Savych
128

Si vous utilisez des storyboards, vous pouvez accéder au Attributes InspectorViewController Navigation Item(cliquez sur Navigation Bar) et définir la Back Buttonpropriété sur "" (un espace). Cela définira le titre du bouton Précédent sur un caractère d'espace, laissant le chevron visible. Pas besoin de jouer avec le code.

exemple d'image

Notez que cela définira le Back Buttontitre du bouton Précédent qui se connectera à ce contrôleur de vue à partir de celui qui a été poussé dessus, et non Back Buttoncelui qui sera affiché à l'intérieur de ce contrôleur!

Nikita Kukushkin
la source
10
Je souhaiterais pouvoir voter davantage: "Notez que cela définira le titre du bouton arrière pour le bouton arrière qui se connectera à ce contrôleur de vue à partir de celui qui a été poussé dessus, pas pour le bouton arrière qui sera affiché à l'intérieur de ce Manette!"
Jayson Lane
121

Cela fonctionne pour moi d'afficher uniquement le chevron `` arrière '' sans aucun texte:

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

Définissez cette propriété dans viewDidLoadle contrôleur de vue présentant la barre de navigation et cela fera l'affaire.

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

Guto Araujo
la source
33
Cela a pour effet secondaire de supprimer l'étiquette de titre au milieu de la barre de navigation.
Pwner
7
Définissez le titre du VC poussant sur 'viewWillAppear' avec la même propriété. De cette façon, il n'est pas supprimé.
Guto Araujo
5
J'ai déplacé ce morceau de code vers -viewDidLoadle VC que je ne veux pas le texte arrière. Cependant, ce que j'ai découvert plus tard, c'est que lorsque j'éclate le 2e VC du navigationControllertexte du titre apparaît peu de temps après, pas immédiatement. Je suppose qu'une vidéo illustrerait mieux cela alors la voici: lien
Pan Ziyue
1
Ce n'est pas la meilleure réponse, veuillez vous référer à la réponse d'Andyleehao: [[UIBarButtonItem apparence] setBackButtonTitlePositionAdjustment: UIOffsetMake (0, -60) forBarMetrics: UIBarMetricsDefault];
lmnbeyond
1
Voici la bonne réponse selon la documentation d'Apple: "Lorsque le récepteur se trouve sur la pile d'éléments de navigation et est le deuxième à partir du haut - en d'autres termes, son contrôleur de vue gère les vues vers lesquelles l'utilisateur reviendrait - la valeur de cette propriété est utilisé pour le bouton Précédent dans la barre de navigation la plus haute. Si la valeur de cette propriété est nulle, le système utilise la chaîne "Précédent" comme texte du bouton Précédent. "
Raphael Oliveira
27

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

--ÉDITER--

Est-ce que quelque chose change lorsque 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 définie sur @ "" 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 de la page pour laquelle je souhaite personnaliser le bouton de retour. C'est en fait dans le contrôleur avant lui sur la pile de navigation.

Kamaros
la source
Hmm, iOS 7 ne semble pas changer cela. Il continue d'utiliser "Retour" comme titre. Si je mets à la setLeftBarButtonItem:backButtonplace, rien ne serait là.
Pan Ziyue
1
Si c'est le cas, et que rien ne se passe lorsque vous définissez le titre sur autre chose, je pense que vous devrez essayer de déplacer votre code vers le contrôleur de vue parent. J'utilise le code que j'ai publié ci-dessus dans ma méthode prepareForSegue.
Kamaros
27

entrez la description de l'image ici

Parfois, il est utile de voir les choses dans leur contexte. Voici un projet minimal qui cache le texte "arrière" mais montre toujours la flèche.

Storyboard

entrez la description de l'image ici

Il y a une séquence d'émission du bouton "Afficher le deuxième contrôleur de vue" au deuxième contrôleur de vue.

J'ai également ajouté un élément de navigation au deuxième contrôleur de vue afin qu'il ait un titre. C'est facultatif. Cela n'affecte pas le bouton de retour.

Code

FirstViewController.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 uniquement, pas de code)

Sur le storyboard, sélectionnez l'élément de navigation pour le premier contrôleur de vue (pas le second). Entrez simplement un espace pour le texte du bouton Retour.

entrez la description de l'image ici

Suragch
la source
Concept clé que "pour le premier contrôleur de vue (pas le second)" comme c'est le nom du VC que vous souhaitez revenir donc c'est la responsabilité de donner ce titre.
buguibu
15
self.navigationController.navigationBar.topItem.title = @"";
Claudio Castro
la source
1
Vous pouvez utiliser backItem au lieu de topItem. TopItem masquera le titre, tandis que backItem masquera le titre du bouton de retour.
Ravi Ojha
2
C'est la seule solution si childViewController est à la profondeur 2+ dans la pile des enfants de NavigationController
Nathaniel Blumer
2
Cela supprimera également le titre du contrôleur de vue précédent. Dans la plupart des cas, ça va sucer
CalZone
11

Sur iOS7, Apple a introduit deux nouvelles propriétés dans UINavigationBar, «backIndicatorTransitionMaskImage» et «backIndicatorImage».

En appelant simplement une fois:

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

Il rendra une image personnalisée au lieu du glyphe chevron par défaut, héritant de la couleur de teinte de keyWindow.

Et pour supprimer le titre, je proposerai la réponse de Kamaros. N'oubliez pas d'appeler ce code sur le contrôleur de vue qui pousse votre nouveau contrôleur de vue. Suppression du texte de titre d'un UIBarButtonItem iOS

DZenBot
la source
Pour ajuster la couleur de la teinte [[Aspect UINavigationBar] setTintColor: [UIColor whiteColor]];
Mazen Kasser
10

Je n'ai pas eu beaucoup de succès avec les réponses fournies mais j'ai trouvé un travail vraiment simple. Dans votre storyboard, vous pouvez cliquer sur l'élément de navigation de votre UIViewController et définir le texte du bouton de retour. Je l'ai placé dans un seul espace et cela m'a donné le comportement que je recherchais.entrez la description de l'image ici

Grahambo
la source
10

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

self.navigationController?.navigationBar.topItem?.title = ""
Ravi
la source
6

Une solution simple à ce problème, fonctionnant sur iOS7 ainsi que sur 6, consiste à définir une vue de titre personnalisée 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;
}

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

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

Étant donné que votre vue de titre est une vue personnalisée, elle ne sera pas remplacée lors du retour dans la pile de navigation.

Matthes
la source
Je n'avais besoin que de la dernière partie du code et non de l'UILabel vierge. Je l'appelais [self.navigationItem.backBarButtonItem setTitle:@" "];dans viewWillAppear mais il ne fonctionnait pas sur les vues présentées après avoir rejeté une vue modale.
Diziet
6

En fait, vous pouvez le faire avec une seule astuce:

Remplacez la UINavigationBarclasse et ajoutez cette ligne de code:

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

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

J'espère que cela t'aides

rordulu
la source
Cela a fonctionné pour moi. Bien qu'il semble qu'il y ait un léger bégaiement dans l'animation push sur iOS 7: le titre semble faire de la place pour le bouton de retour puis se centre puisqu'il n'y en a pas.
zekel
Oui, essayez d'utiliser titleView personnalisé au lieu de définir directement navigationItem.title. Je pense que cela devrait régler votre problème.
rordulu
cette solution est géniale car elle est globale pour chaque navigationBar qui a la sous-classe. Merci
Yetispapa
5

J'ai pu bricoler quelque chose ensemble en utilisant la réponse de DonnaLea. Voici comment 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 y revenez. Tenter de réinitialiser le titre dans viewWillDisappear est trop tard dans le processus de transition; Cela provoque le retour du titre au lieu de bien s'animer. Cependant, le willMoveToParentViewController se produit plus tôt et permet le comportement correct.

Avertissement: je n'ai testé cela qu'avec un push / pop UINavigationController normal. Il peut y avoir un comportement inattendu supplémentaire dans d'autres situations.

BradB
la source
4

Dans la méthode prepareForSegue: de votre premier ViewController, vous définissez le titre de cette vue sur @ "", donc lorsque la prochaine vue est poussée, elle affichera le titre précédent de ViewController qui sera @ "".

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

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

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

Je n'aime pas beaucoup cette solution mais elle fonctionne et je n'ai pas trouvé d'autre moyen de la faire.

Alejandro Figueroa
la source
4

SWIFT 3

navigationController?.navigationBar.topItem?.title = ""
Jiří Zahálka
la source
3

Aucune des réponses ne m'a aidé. Mais une astuce a été faite - je viens d'effacer le titre du contrôleur de vue qui a poussé (là où le bouton retour va) juste avant de le pousser.

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

Sur viewWillAppearla vue de poussée, j'ai remis le titre original.

Kof
la source
1
Hmm, cette astuce fonctionne. Cependant, il semble que les mots là-haut clignotent parfois. Pas une très bonne solution de contournement mais néanmoins une bonne solution. +1
Pan Ziyue
3
    NSDictionary *attributes = [NSDictionary dictionaryWithObjectsAndKeys:
                                [UIColor clearColor],UITextAttributeTextColor,
                                nil];

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

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

--ÉDITER--

c'est une solution lorsque vous voulez vraiment supprimer le texte du titre de tous les UIBarbuttonItem. Si vous souhaitez uniquement supprimer le titre de l'élément de bouton de la barre arrière, il n'y a pas de solution simple et pratique. Dans mon cas, comme je n'ai que quelques UIBarButtonItems qui ont besoin d'afficher le texte du titre, je viens de changer le titre de ces boutons spécifiques titleTextAttributes. Si vous voulez être plus précis, utilisez le code ci-dessous, qui ne changera que les boutons de la barre de navigation:

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

[[UIBarButtonItem appearanceWhenContainedIn:[UINavigationBar class], nil] setTitleTextAttributes:attributes
                                                forState:UIControlStateNormal];
andylee
la source
1
Cela fonctionne pour moi, mais vous pouvez brièvement voir le texte lorsque vous revenez.
Diziet
3
@Diziet essayez d' ajouter la même chose pour l'Etat UIControlStateHighlightedet
CoderPug
2
Cela fonctionne bien, mais cela "cache" également tous les autres boutons, pas seulement le bouton Retour ... Des idées pour résoudre ce problème?
Urkman
3

Cette utilisation de la sous-classe navigationControllersupprime le "Retour".

J'utilise cela pour le supprimer, de manière permanente via 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
0yeoj
la source
3
[[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];
Bill Xie
la source
1
Veuillez ajouter des explications à votre réponse.
Alex
1 faire la même couleur que la barre de navigation 2 rendre la taille du texte assez petite pour ne pas presser le titre
Bill Xie
J'ai révisé votre réponse, vous devez toujours appuyer votre réponse.
Alex
2

Masquer le bouton Retour Titre de la barre de navigation

UIBarButtonItem *barButton = [[UIBarButtonItem alloc] init];
barButton.title = @""; // blank or any other title
self.navigationController.navigationBar.topItem.backBarButtonItem = barButton;
Kirit Vaghela
la source
2

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

override func viewDidLoad() {
    super.viewDidLoad()
    navigationController?.navigationBar?.backItem?.title = ""
}
YannSteph
la source
2

Swift 3.1 Vous pouvez le faire en implémentant la méthode déléguée de UINavigationController. Cela masquera le titre avec le bouton de retour uniquement, 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
    }
SMMoinuddin. Shuvo
la source
1

Vous pouvez également utiliser ceci:

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

[temporaryBarButtonItem release];

Ça marche pour moi

Utkarsh 786
la source
1
case : <Back as <

override func viewWillAppear(animated: Bool) {
navigationController!.navigationBar.topItem!.title = ""
    }
AG
la source
1

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
}
PeiweiChen
la source
la solution la plus dump de tous ... elle utilise également l'espace comme avant ... c'est juste devenu transparent ...
Laszlo
Il supprime le texte de tous les UIBarButtonItems de l'application
Mikel Sanchez
1

Je crée une classe personnalisée pour UINavigationControlleret l'applique à tous les contrôleurs de navigation de mon application. À l'intérieur de cette UINavigationControllerclasse personnalisée , j'ai défini le UINavigationBardélégué selfune fois la vue chargée .

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

Ensuite, j'implémente la méthode déléguée:

- (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 il efface le titre de tous les boutons de retour. Et pour plus de clarté, j'ai toujours défini le titre de tous mes autres contrôleurs de vue à l'intérieur viewWillAppearafin que le titre soit toujours mis à jour juste avant que la vue n'apparaisse (au cas où il serait supprimé par des astuces comme celle-ci).

nurider
la source
1

Il suffit de saisir un seul espace pour l'élément de navigation du bouton Retour fonctionne !!

VirajP
la source
1
C'est plus approprié comme commentaire que comme réponse.
Al Lelopath
1

Si, comme moi, vous utilisez une vue personnalisée au lieu de UINavigationBaret que vous êtes coincé avec le bouton de retour, vous devez faire un peu de travail qui semble un peu maladroit.

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

Il semble que s'il n'est pas présenté, peu importe ce qu'il essaiera d'afficher un titre, cela signifie qu'il est affiché puis masqué avant d'être dessiné et résout le problème.

Nicholas Smith
la source
1
extension UIViewController{
    func hideBackButton(){
        navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)
    }
}
Maor
la source
1

J'ai créé une catégorie de configuration zéro très simple pour masquer tous les titres du bouton de retour via l'application, vous pouvez le vérifier ici . Cette question a déjà accepté la réponse, mais pour d'autres, elle peut être utile.

ÉDITER:

fichier .h

#import <UIKit/UIKit.h>

@interface UINavigationController (HideBackTitle)
extern void PJSwizzleMethod(Class cls, SEL originalSelector, SEL swizzledSelector);

@end

fichier .m

#import "UINavigationController+HideBackTitle.h"
#import <objc/runtime.h>


@implementation UINavigationController (HideBackTitle)

+ (void)load {
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        PJSwizzleMethod([self class],
                    @selector(pushViewController:animated:),
                    @selector(pj_pushViewController:animated:));
    });
}

- (void)pj_pushViewController:(UIViewController *)viewController animated:(BOOL)animated {
    UIViewController *disappearingViewController =  self.viewControllers.lastObject;
    if (disappearingViewController) {
        disappearingViewController.navigationItem.backBarButtonItem=[[UIBarButtonItem alloc] initWithTitle:@"" style:UIBarButtonItemStylePlain target:nil action:nil];
    }
    if (!disappearingViewController) {
        return [self pj_pushViewController:viewController animated:animated];
    }
    return [self pj_pushViewController:viewController animated:animated];
}



@end

void PJSwizzleMethod(Class cls, SEL originalSelector, SEL swizzledSelector)
{
    Method originalMethod = class_getInstanceMethod(cls, originalSelector);
    Method swizzledMethod = class_getInstanceMethod(cls, swizzledSelector);

    BOOL didAddMethod =
    class_addMethod(cls,
                originalSelector,
                method_getImplementation(swizzledMethod),
                method_getTypeEncoding(swizzledMethod));

    if (didAddMethod) {
        class_replaceMethod(cls,
                        swizzledSelector,
                        method_getImplementation(originalMethod),
                        method_getTypeEncoding(originalMethod));
    } else {
        method_exchangeImplementations(originalMethod, swizzledMethod);
    }
}
Pratik Jamariya
la source