web-dev-qa-db-fra.com

UINavigationBar Masquer le texte du bouton

Comment masquer le texte du bouton Précédent à un contrôleur UINavigation? .__ Je n'aurai que le "<" et pas "<Retour"

76
Nils

Dans le générateur d'interface , vous pouvez sélectionner l'élément de navigation du contrôleur précédent et remplacer la chaîne Back Button par le nom du bouton Précédent. Si vous voulez le laisser vide, par exemple, mettez juste un espace.

Vous pouvez aussi le changer avec cette ligne de code:

[self.navigationItem.backBarButtonItem setTitle:@"Title here"];

Ou dans Swift :

self.navigationItem.backBarButtonItem?.title = ""

93
rebello95

Vous pouvez également le faire via le storyboard. Dans l'inspecteur d'attributs de l'élément de navigation du contrôleur précédent , vous pouvez définir "" dans le champ du bouton Précédent. Voir l'image ci-dessous. Remplacez "Votre titre ici" par "". En faisant cela, vous obtiendrez le résultat souhaité. Vous n'avez plus besoin de jouer avec le "Titre".

Par programme, vous pouvez utiliser

[self.navigationItem.backBarButtonItem setTitle:@" "]; 

self fait référence au contrôleur qui pousse le contrôleur View souhaité.

Xcode view controller navigation item

Échantillon avant, après la barre de navigation

Avant Before

Après After

76
Shahzin KS

Vous pouvez implémenter UINavigationControllerDelegate comme ceci:

vieux Swift

func navigationController(navigationController: UINavigationController, willShowViewController viewController: UIViewController, animated: Bool) {
    let item = UIBarButtonItem(title: " ", style: .Plain, target: nil, action: nil)
    viewController.navigationItem.backBarButtonItem = item
}

Swift 4.x

class MyNavigationController: UINavigationController, UINavigationControllerDelegate {
override func viewDidLoad() {
    super.viewDidLoad()
    self.delegate = self
}

func navigationController(_ navigationController: UINavigationController, willShow viewController: UIViewController, animated: Bool) {
    let item = UIBarButtonItem(title: " ", style: .plain, target: nil, action: nil)
    viewController.navigationItem.backBarButtonItem = item
}

}

backBarButtonItem est nil par défaut et affecte le prochain contrôleur poussé. Vous devez donc le définir pour tous les contrôleurs.

52
VoidLess

La définition du titre du bouton de retour sur @"" ou nil ne fonctionnera pas. Vous devez définir le bouton entier vide (sans titre ni image):

Objectif c

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

Rapide

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

Cela devrait être fait sur le contrôleur de vue qui se trouve au-dessus de votre contrôleur de vue dans la pile de navigation (c'est-à-dire depuis lequel vous accédez à votre VC via la méthode pushViewController)

30
jackal

Une autre solution à ce problème dans les situations où vous avez beaucoup de contrôleurs de vue consiste à utiliser un proxy UIAppearance pour masquer efficacement le texte du titre du bouton Précédent, comme ceci:

UIBarButtonItem *navBarButtonAppearance = [UIBarButtonItem appearanceWhenContainedIn:[UINavigationBar class], nil];

[navBarButtonAppearance setTitleTextAttributes:@{
    NSFontAttributeName:            [UIFont systemFontOfSize:0.1],
    NSForegroundColorAttributeName: [UIColor clearColor] }
                                      forState:UIControlStateNormal];

Cette solution rendra le texte sous forme de minuscule point clair, similaire à la définition manuelle du titre du bouton précédent sur @" ", à la différence qu'il affecte tous les boutons de la barre de navigation.

Je ne suggère pas cela comme une solution générale au problème, car cela concerne tous les boutons de la barre de navigation. Il renverse le paradigme pour que vous choisissiez quand afficher les titres de bouton, plutôt que quand masquer les titres.

Pour choisir quand afficher les titres, restaurez manuellement les attributs de texte de titre selon vos besoins ou créez une sous-classe spécialisée de UIBarButtonItem faisant la même chose (éventuellement avec un autre proxy UIAppearance.).

Si vous avez une application dans laquelle la plupart des titres des boutons de retour doivent être masqués et que seuls quelques-uns (ou aucun) des boutons de navigation sont des boutons système avec des titres, cela pourrait être pour vous!

(Remarque: le changement de taille de la police est nécessaire même si la couleur du texte est claire afin de garantir que les titres longs ne provoquent pas le déplacement du titre central de la barre de navigation).

29
Adam Kaplan

Ajoutez le code suivant dans viewDidLoad ou loadView

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

Je l'ai testé sur iPhone et iPad avec iOS 9

27
alones

Vous pouvez ajouter cette catégorie Objective-C pour que tous les boutons "Précédent" créés par un contrôleur de navigation n'aient pas de texte. Je viens de l'ajouter à mon fichier AppDelegate.m.

@implementation UINavigationItem (Customization)

/**
 Removes text from all default back buttons so only the arrow or custom image shows up.
 */
-(UIBarButtonItem *)backBarButtonItem
{
    return [[UIBarButtonItem alloc] initWithTitle:@"" style:UIBarButtonItemStylePlain target:nil action:nil];
}

@end

PS - (Je ne savais pas comment faire fonctionner cette extension avec Swift, c’était des erreurs étranges. Les modifications sont bienvenues pour ajouter une version de Swift)

14
teradyl

pour supprimer le texte du bouton arrière par programme, utilisé ci-dessous Code cela fonctionnera sous la forme xcode7 et au-dessus.

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

ou

manuellement Dans les storyboards, sélectionnez la barre de navigation sur le contrôleur de vue et mettez "" dans le texte du bouton Précédent.

cela fonctionnera. Merci 

10
Jyothi Babu Pakalz

La seule chose qui fonctionne sans effets secondaires est de créer un bouton de retour personnalisé. Tant que vous ne fournissez pas d'action personnalisée, même le geste de la diapositive fonctionne.

extension UIViewController {
func setupBackButton() {
    let customBackButton = UIBarButtonItem(title: " ", style: .plain, target: nil, action: nil)
    navigationItem.backBarButtonItem = customBackButton
}}

Malheureusement, si vous souhaitez que tous les boutons Précédent ne contiennent aucun titre, vous devez configurer ce bouton Retour personnalisé dans tous vos contrôleurs de vue:

override func viewDidLoad() {
    super.viewDidLoad()

    setupBackButton()
}

Il est très important de définir un espace comme titre et non une chaîne vide.

8
Cezar Signori

La réponse actuelle ne fonctionnait pas. Je voulais supprimer le titre entièrement, mais le texte "retour" ne disparaissait pas. 

Retournez au contrôleur de vue précédent et définissez sa propriété title:

self.title = @" ";

ONLY fonctionne lorsque le précédent View Controller n'a pas de titre

6
ChrisHaze

Autre moyen - utilisez la classe personnalisée NavigationBar.

class NavigationBar: UINavigationBar {

    var hideBackItem = true
    private let emptyTitle = ""

    override func layoutSubviews() {
        if let `topItem` = topItem,
            topItem.backBarButtonItem?.title != emptyTitle,
            hideBackItem {
            topItem.backBarButtonItem = UIBarButtonItem(title: emptyTitle, style: .plain, target: nil, action: nil)
        }

        super.layoutSubviews()
    }

}

C’est-à-dire que cela supprime les titres de tout le projet . Il suffit de définir une classe personnalisée pour UINavigationController.

4
LLIAJLbHOu

Définissez le titre de la chaîne VC précédente sur "" avec espace. et le titre avec le bouton de retour sera remplacé par une chaîne d’espace unique.

Self.title = " "

Au retour, appuyez à nouveau sur le titre pour le remettre dans son affichage d'origine.

4
Mohit Kumar

Utilisez une NavigationController personnalisée qui remplace pushViewController

class NavigationController: UINavigationController {  
  override func pushViewController(_ viewController: UIViewController, animated: Bool) {
    viewController.navigationItem.backBarButtonItem =
      UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)
    super.pushViewController(viewController, animated: animated)
  }
}
3
onmyway133

Beaucoup de réponses déjà, voici mes deux cents sur le sujet. J'ai trouvé cette approche très robuste. Vous avez juste besoin de mettre ceci dans viewController avant segue. 

Swift 4:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)
}
3
Satnam Sync

J'ai essayé certains ci-dessus mais ils n'ont pas fonctionné. Cela a fonctionné pour moi:

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    self.navigationController?.navigationBar.topItem?.title = ""
}
3
poima

Swift 3.1 Vous pouvez le faire en implémentant la méthode déléguée de UINavigationController. 

func navigationController(_ navigationController: UINavigationController, 
                          willShow viewController: UIViewController, animated: Bool) {

    /** It'll hide the Title with back button only,
     ** we'll still get the back arrow image and default functionality.
     */
    let item = UIBarButtonItem(title: " ", style: .plain, target: nil, 
                               action: nil)
    viewController.navigationItem.backBarButtonItem = item
}
2

J'ai tout essayé dans ce post. La seule solution qui fonctionne est @ VoidLess's

Voici la même réponse mais plus complète 

class CustomNavigationController: UINavigationController {

    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        self.delegate = self
    }
}


// MARK:UINavigationControllerDelegate
extension CustomNavigationController {
    func navigationController(_ navigationController: UINavigationController, willShow viewController: UIViewController, animated: Bool) {
        viewController.navigationItem.backBarButtonItem = UIBarButtonItem(title: " ", style: .plain, target: nil, action: nil)
    }
}
2

Dans Swift3,

Si vous définissez un paramètre global 

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {

    // ..

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


    // ...

}
2
taku_oka

Ceci est ma résolution pour iOS11, je modifie l'apparence de UIBarButtonItem dans applicationDidFinishLaunchingWithOptions:

UIBarButtonItem.appearance().setBackButtonTitlePositionAdjustment(UIOffsetMake(-100, 0), for:UIBarMetrics.default)

Vous ne pouvez pas modifier le décalage en Y, car cela modifiera également la position du bouton de barre arrière dans iOS11, mais c'est OK dans iOS10 et les versions antérieures.

1
VictorChee

Pour ceux qui veulent masquer le titre du bouton de manière globale.

Vous pouvez balayer viewDidLoad de UIViewController comme ceci. 

+ (void)overrideBackButtonTitle {

    NSError *error;

    // I use `Aspects` for easier swizzling.

    [UIViewController aspect_hookSelector:@selector(viewDidLoad)
                              withOptions:AspectPositionBefore
                               usingBlock:^(id<AspectInfo> aspectInfo)
    {

        UIViewController *vc = (UIViewController *)aspectInfo.instance;

        // Check whether this class is my app's view controller or not.
        // We don't want to override this for Apple's view controllers,
        // or view controllers from external framework.

        NSString *className = NSStringFromClass([vc class]);
        Class class = [NSBundle.mainBundle classNamed:className];
        if (!class) {
           return;
        }

        UIBarButtonItem *backButton = [[UIBarButtonItem alloc] initWithTitle:@" " style:UIBarButtonItemStylePlain target:nil action:nil];
        vc.navigationItem.backBarButtonItem = backButton;

    } error:&error];

    if (error) {
        NSLog(@"%s error: %@", __FUNCTION__, error.localizedDescription);
    }

}

Usage:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    [[self class] overrideBackButtonTitle];
    return YES;
}
1
nRewik

Enfin trouvé la solution idéale pour masquer le texte de retour par défaut dans toute l'application.

Ajoutez simplement une image transparente et ajoutez le code suivant dans votre AppDelegate.

UIBarButtonItem.appearance().setBackButtonBackgroundImage(#imageLiteral(resourceName: "transparent"), for: .normal, barMetrics: .default)
0
Lalit Kumar

Ma solution: - XCode: 10.2.1 - Swift: 5

  • Contrôleur de vue parent:
    • self.title = ""
  • Contrôleur de vue enfant:
    • self.navigationItem.title = "Votre titre" // pour définir le titre pour viewcontroller
0
PhuocLuong

Je me débattais avec ceci car j'avais un contrôleur de navigation personnalisé . J'ai pu supprimer le texte de l'élément arrière dans tous les contrôleurs de vue avec ce code dans ma classe de contrôleur de navigation personnalisé override func viewDidLayoutSubviews() { self.navigationBar.backItem?.title = "" }

Cela supprime tous les titres d'élément précédent à l'aide de ce contrôleur de navigation personnalisé.

0
Amy.R

Le texte de retour provenant de navigationItem.title , et navigationItem.title du contrôleur de vue précédent est automatiquement défini par self.title. Le moyen le plus simple de résoudre le problème est le hook setTitle: , assurez-vous que navigationItem.title = @""

Mettez ce code à AppDelegate.m ça ira。

    [UIViewController aspect_hookSelector:@selector(setTitle:)
                              withOptions:AspectPositionAfter
                               usingBlock:^(id<AspectInfo> aspectInfo, NSString *title) {
        UIViewController *vc = aspectInfo.instance;
        vc.navigationItem.titleView = ({
            UILabel *titleLabel = [[UILabel alloc] initWithFrame:CGRectZero];
            titleLabel.font = [UIFont preferredFontForTextStyle:UIFontTextStyleHeadline];
            titleLabel.text = title;
            titleLabel;
        });
        vc.navigationItem.title = @"";
    } error:NULL];

Plus de détails sur https://www.jianshu.com/p/071bc50f1475 (Simple Chinease

0
fengxing
-(void)setNavigationItems{
     UIBarButtonItem *leftBarButtonItem=[[UIBarButtonItem alloc]initWithTitle:@"**Your title here**" style:UIBarButtonItemStyleBordered target:self action:@selector(backButtonClicked)];   
     self.navigationController.navigationBar.topItem.backBarButtonItem=leftBarButtonItem;
}
-(void)backButtonClicked{
    [self.navigationController popViewControllerAnimated:YES];
}
0
neeraj singla