UINavigationBar bouton de retour personnalisé sans titre


231

Comment puis-je personnaliser le bouton de navigation arrière dans iOS 7 et supérieur sans titre? (c'est-à-dire avec la flèche uniquement)

self.navigationItem.leftBarButtonItem = self.editButtonItem;

Je me demande simplement s'ils ont des self.backButtonItem;

OU

quelque chose comme ça?

self.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc]
                   initWithBarButtonSystemItem:UIBarButtonSystemItemBACK 
                   target:self action:@selector(back)];

3
Vous pouvez utiliser @hiroshi answer + barre de navigation propriété tintColor pour créer un chevron avec une couleur personnalisée et sans aucun titre
Dmitry Zhukov

Pour ceux qui ont une barre d'onglets, et vous ne voulez pas le texte du bouton retour, le correctif est: dans la vue ViewDidLoad () du TabBarController, mettez: self.navigationItem.backBarButtonItem = UIBarButtonItem (title: "", style:. plaine, cible: néant, action: néant)
Borzh

Réponses:


313

C'est en fait assez simple, voici ce que je fais:

Objectif c

// Set this in every view controller so that the back button displays back instead of the root view controller name
self.navigationItem.backBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"" style:UIBarButtonItemStylePlain target:nil action:nil];

Swift 2

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

Swift 3

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

Mettez cette ligne dans le contrôleur de vue qui pousse sur la pile ( le contrôleur de vue précédent ). Le bouton de retour du contrôleur de vue nouvellement poussé affichera maintenant tout ce que vous avez mis pour initWithTitle, qui dans ce cas est une chaîne vide.


3
Je l'ai utilisé mais le titre vient et disparaît de façon animée ??
user1010819

7
Merci Kyle! Je cherchais un moyen de renommer le bouton de retour par défaut dans iOS 7. Je l'ai mis dans mon prepareForSeguedans le contrôleur de vue et cela a parfaitement fonctionné.
yiwei

1
@ user1010819 C'est le comportement attendu, barButtonItems s'animera lors de la commutation des contrôleurs de vue. Qu'est-ce que vous essayez d'accomplir?
Kyle Begeman

1
@YiweiGao Pas de problème! C'est juste une autre de ces choses que si vous connaissez le bon code, c'est assez simple! Je suis content que cela ait aidé!
Kyle Begeman

3
J'ai l'impression que cela a besoin d'une mise à jour, cela ne montre rien pour l'instant, la flèche n'est pas là par défaut?
Mathijs Segers

198

J'ai trouvé un moyen facile de créer mon bouton de retour avec une seule flèche iOS.

Supposons que vous ayez un contrôleur de navigation allant vers ViewA depuis ViewB. Dans IB, sélectionnez la barre de navigation de ViewA, vous devriez voir ces options: Titre, invite et bouton Retour.

Options de barre de navigation

Options de barre de navigation

L'astuce consiste à choisir le titre du bouton de retour de votre contrôleur de vue (ViewB) dans les options du contrôleur de vue précédent (View A). Si vous ne remplissez pas l'option "Bouton Retour", iOS mettra automatiquement le titre "Retour", avec les précédents contrôleur de vue. Vous devez donc remplir cette option avec un seul espace.

Remplissez l'espace dans l'option "Bouton Retour"

Remplissez l'espace dans l'option "Bouton Retour"

Le résultat:

Le résultat:


Bienvenue dans Stack Overflow . Si vous ne l'avez pas déjà fait, jetez un œil à notre tournée et lisez certains articles du centre d'aide sur la façon dont nous travaillons et certaines des coutumes de la communauté ici. Si vous avez besoin d'aide avec les fonctions du site, n'hésitez pas à rechercher, puis posez une question sur Meta Stack Overflow (si vous ne trouvez toujours pas de réponse). Merci et bonne chance! Quoi qu'il en soit, vous pouvez publier vos images maintenant ... :)
Qantas 94 Heavy

53
cela fonctionne, faites juste attention - vous devez définir le "bouton arrière" pour le contrôleur précédent (par exemple pour rootViewController dans votre contrôleur de navigation)
evfemist

Assurez-vous que "hidesBackButton" n'est pas défini sur TRUE sur l'élément de navigation dans ViewA
shim

Il me semble que cela fonctionne si le titre du contrôleur présentateur est suffisamment long - s'il s'agit d'un titre court, il sera utilisé à la place.
amergin

1
pour moi , il ne fonctionne que lorsque les deux la source et la destination NavigationItem ont de ViewController Back Buttondéfini sur un espace unique ( par exemple à la fois viewA et viewB)
dcestari

72

Utilisez simplement une image!

OBJ-C :

- (void)viewDidLoad {
     [super viewDidLoad];
     UIBarButtonItem *backButton = [[UIBarButtonItem alloc] initWithImage:[UIImage imageNamed:@"Icon-Back"]
                                                                                        style:UIBarButtonItemStylePlain
                                                                                       target:self.navigationController
                                                                                       action:@selector(popViewControllerAnimated:)];
     self.navigationItem.leftBarButtonItem = backButton;
}

SWIFT 4 :

let backBTN = UIBarButtonItem(image: UIImage(named: "Back"), 
                              style: .plain, 
                              target: navigationController, 
                              action: #selector(UINavigationController.popViewController(animated:)))
navigationItem.leftBarButtonItem = backBTN
navigationController?.interactivePopGestureRecognizer?.delegate = self

Icon-Back.png

Icon-Back

Icon-Back@2x.png

Icon-Back @ 2x

Icon-Back@3x.png

Icon-Back @ 23x


4
Avec cette solution, vous semblez perdre la fonctionnalité «glisser pour revenir en arrière».
j7nn7k

16
navigationController?.interactivePopGestureRecognizer?.delegate = selffait l'astuce pour garder le geste de balayage arrière
Victor Carmouze

J'ai cherché cette réponse, peut-être toute ma vie, à savoir le sélecteur d'action.
Des

29

iOS7 a de nouvelles règles d'interface, il est donc préférable de conserver au moins la flèche arrière lorsque vous appuyez sur une UIView. Il est très facile de modifier le texte "arrière" par programme. Ajoutez simplement ce code avant de pousser la vue (ou prepareForSegue si vous utilisez StoryBoards):

-(void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{
      self.navigationItem.backBarButtonItem=[[UIBarButtonItem alloc] initWithTitle:@"NEW TITLE" style:UIBarButtonItemStylePlain target:nil action:nil];
}

Cela changera le texte par défaut "Retour", mais gardera la flèche de retour de style iOS7. Vous pouvez également modifier la couleur de la teinte de la flèche arrière avant de pousser la vue:

- (void)viewDidLoad{
     //NavBar background color:
     self.navigationController.navigationBar.barTintColor=[UIColor redColor];
//NavBar tint color for elements:
     self.navigationController.navigationBar.tintColor=[UIColor whiteColor];
}

J'espère que cela vous aide!


2
Cela fonctionne vraiment bien et semble meilleur que les autres options. Par exemple, le titre n'a jamais besoin d'être réinitialisé à la valeur précédente, contrairement à certaines des autres réponses.
pr1001

26

Vous n'avez rien à faire. Vous pouvez obtenir le même résultat grâce au storyboard lui-même.

Allez simplement sur le contrôleur de navigation racine et donnez un espace. N'oubliez pas non pas au contrôleur que vous vouliez le bouton de retour sans titre, mais au contrôleur de navigation racine.

Selon l'image ci-dessous.  Cela fonctionne pour iOS 7 et iOS 8


Je l'ai essayé, ça marche. Mais je ne peux toujours pas changer le titre dans le code.
Yu-Lin Wang

A travaillé avec XCode7, mais ne fonctionne plus dans xCode8 -> ios10.X, j'ai utilisé la méthode
@iwasrobbed

Tout génie est simple!
Illya Krit

22

Bien que la réponse de Kyle Begeman fasse totalement l'affaire, il est assez ennuyeux d'avoir ce code dans tous les contrôleurs de vue possibles. Je me suis retrouvé avec une UINavigationItemcatégorie simple . Attention, voici des dragons! Désolé, je veux dire, tourbillonnant:

#import <objc/runtime.h>

@implementation UINavigationItem (ArrowBackButton)

static char kArrowBackButtonKey;

+ (void)load {
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        Method m1 = class_getInstanceMethod(self, @selector(backBarButtonItem));
        Method m2 = class_getInstanceMethod(self, @selector(arrowBackButton_backBarButtonItem));
        method_exchangeImplementations(m1, m2);
    });
}

- (UIBarButtonItem *)arrowBackButton_backBarButtonItem {
    UIBarButtonItem *item = [self arrowBackButton_backBarButtonItem];
    if (item) {
        return item;
    }

    item = objc_getAssociatedObject(self, &kArrowBackButtonKey);
    if (!item) {
        item = [[UIBarButtonItem alloc] initWithTitle:@"" style:UIBarButtonItemStyleBordered target:nil action:NULL];
        objc_setAssociatedObject(self, &kArrowBackButtonKey, item, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
    }
    return item;
}

@end

1
J'ai voté mais j'ai décidé d'utiliser un hack plus simple à la place - [[UIBarButtonItem appearance] setBackButtonTitlePositionAdjustment:UIOffsetMake(-1000, -1000) forBarMetrics:UIBarMetricsDefault]; ( source ) - pourrait être un peu moins élégant, mais le swizzling ressemblait à une surpuissance
dmur

2
Sérieusement, vous tous ... ne passez pas à autre chose. Mettez en œuvre la solution @nicky publiée en tant que catégorie et n'hésitez pas. Il s'agit d'une excellente solution réutilisable qui peut être implémentée à l'échelle de l'application si vous ajoutez ce fichier Prefix.pch. Apple encourage l'utilisation de catégories pour ajouter des méthodes aux classes existantes, vous devriez en profiter lorsque cela est possible.
zmonteca

C'est la meilleure solution à mon avis, de toute façon le "method_exchangeImplementation" est un peu dangereux, jetez un oeil à ceci: bonne façon de swizzle et ce guide de swizzling NSHipster
Alessandro Orrù

@ AlessandroOrrù Dans ce cas particulier, cela devrait être sûr car la méthode swizzled est une méthode UINavigationItemtrès propre, il n'y a pas d'héritage impliqué. Et il _cmdest très peu probable d'être impliqué dans un getter. Quoi qu'il en soit, c'est un bon point. Alors, si vous avez l'un de ces nombreux assistants accélérés dans votre projet, assurez-vous de l'utiliser également ici.
secondcitysaint

21

EDIT: 2014-04-09: Comme j'ai acquis une réputation, je suis désolé car je n'utilise plus cette astuce. Je recommande la réponse de Kyle. Notez également que le selfof self.navigationItem.backBarButtonItemn'est pas le contrôleur de vue, le bouton de retour est affiché, mais que le contrôleur de vue précédent doit revenir.

Si vous n'avez pas besoin d'avoir le texte du titre pour le contrôleur de vue précédent, remplissez simplement le titre avec une chaîne vide;

self.navigationItem.title = @"";
[self.navigationController pushViewController:viewController animated:YES];

Cela empêchera d'afficher "en arrière" avec un chevron sur le contrôleur de vue poussé.

EDIT: Même si vous utilisez un texte de titre non vierge, le réglage du titre du contrôleur de vue précédent viewWillAppear:fonctionne, sauf que le titre peut clignoter en un clin d'œil lorsque le contrôleur de vue est apparu. Je pense que "l'application Twitter" semble faire un hack plus subtil pour éviter le scintillement.


Le seul problème que j'ai eu ici est que lorsque je frappe la barre de navigation pour revenir en arrière, le titre de la vue précédente devient vide. Quelque chose autour de ça?
Alioo

@Alioo Avez-vous essayé ce que j'ai mentionné dans la ligne "EDIT"?
hiroshi

20

Cela fonctionne, mais il supprimera le titre de l'élément précédent, même si vous y revenez:

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

Définissez simplement cette propriété sur viewDidLoadle View Controller poussé.


17
Cela supprimera le titre de l'élément précédent, même si vous y revenez. Pas très bon :(
Antzi

J'ai défini le titre du VC poussant viewWillAppearafin qu'il soit toujours correctement réglé.
Guto Araujo

@GutoAraujo Cela fonctionne, mais le titre réapparaît avec un délai de 1 ou 2 secondes, ce qui rend l'UX pas si bon.
fuiiii

Dans xCode8 -> ios10.X, cela semble être le seul moyen de résoudre le problème
LucioB

12

C'est ainsi que je le fais et le plus simple, le plus efficace et le plus clair.

Cela fonctionne si intégré Navigation Controller

Swift 3

Dans viewDidLoadj'ajoute cela au contrôleur de vue, vous voulez que le bouton de retour soit juste une flèche.

if let topItem = self.navigationController?.navigationBar.topItem {
   topItem.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)
}

La différence avec la réponse de @Kyle Begeman est que vous appelez cela sur le contrôleur de vue que vous voulez que le bouton de retour soit juste une flèche, pas sur le contrôleur de vue de pile.


7

Vous n'avez pas accès à la navigation backButtonItem comme vous le souhaitez, vous devez créer votre propre bouton de retour comme ci-dessous:

- (void)loadView
{
    [super loadView];
    UIButton *backButton = [[UIButton alloc] initWithFrame: CGRectMake(0, 0, 44.0f, 30.0f)];
    [backButton setImage:[UIImage imageNamed:@"back.png"]  forState:UIControlStateNormal];
    [backButton addTarget:self action:@selector(popVC) forControlEvents:UIControlEventTouchUpInside];
    self.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc] initWithCustomView:backButton];
}

Et bien sûr:

- (void) popVC{
  [self.navigationController popViewControllerAnimated:YES];
}

puis nous avons perdu la belle animation de fondu sur le bouton de retour
Kiddo

3
Vous avez besoin d'un masque pour des transitions en douceur. "* Si vous souhaitez utiliser une image personnalisée pour remplacer le chevron par défaut, vous devez également créer une image de masque personnalisé. IOS 7 utilise le masque pour faire apparaître ou disparaître le titre de l'écran précédent du chevron pendant la navigation transitions. "
utilisateur

3
@null, vous perdrez le geste de balayage latéral d'iOS 7!
Mazen Kasser

@user J'obtiens l'image personnalisée mais la couleur de la teinte est bleu par défaut. Comment puis-je ne pas ajouter de teinte? merci
Mazen Kasser

7

Objectif: personnaliser tous les boutons de retour surUINavigationBarune icône blanche

Étapes: 1. dans la méthode "didFinishLaunchingWithOptions" d'AppDelete:

UIImage *backBtnIcon = [UIImage imageNamed:@"navBackBtn"];


if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"7.0")) {
    [UINavigationBar appearance].tintColor = [UIColor whiteColor];
    [UINavigationBar appearance].backIndicatorImage = backBtnIcon;
    [UINavigationBar appearance].backIndicatorTransitionMaskImage = backBtnIcon;
}else{

    UIImage *backButtonImage = [backBtnIcon resizableImageWithCapInsets:UIEdgeInsetsMake(0, backBtnIcon.size.width - 1, 0, 0)];
    [[UIBarButtonItem appearance] setBackButtonBackgroundImage:backButtonImage  forState:UIControlStateNormal barMetrics:UIBarMetricsDefault];

    [[UIBarButtonItem appearance] setBackButtonTitlePositionAdjustment:UIOffsetMake(0, -backButtonImage.size.height*2) forBarMetrics:UIBarMetricsDefault];
}

2. dans la viewDidLoadméthode de la super ViewControllerclasse commune:

 if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"7.0")) {
        UIBarButtonItem *backItem = [[UIBarButtonItem alloc] initWithTitle:@""
                                                                     style:UIBarButtonItemStylePlain
                                                                    target:nil
                                                                    action:nil];
        [self.navigationItem setBackBarButtonItem:backItem];
    }else{
        //do nothing
    }

Cela montre qu'un avertissement "Version implicite de SYSTEM_VESION _..." n'est pas valide dans C99.
Jayprakash Dubey

7

SWIFT 4

Pour ceux qui cherchent à créer des boutons arrière personnalisés et à supprimer leur titre, veuillez utiliser le morceau de code suivant dans le contrôleur de vue qui pousse le nouveau:

self.navigationController?.navigationBar.backIndicatorImage = UIImage(named: "close")
self.navigationController?.navigationBar.backIndicatorTransitionMaskImage = UIImage(named: "close")
self.navigationItem?.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)

Pour une utilisation plus universelle, procédez comme suit:

  1. Créez une fonction universelle comme suit:

    func addCustomizedBackBtn(navigationController: UINavigationController?, navigationItem: UINavigationItem?) {
        navigationController?.navigationBar.backIndicatorImage = UIImage(named: "close")
        navigationController?.navigationBar.backIndicatorTransitionMaskImage = UIImage(named: "close")
        navigationItem?.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)
    }
  2. Ensuite, utilisez-le dans les contrôleurs de vue comme suit:

    addCustomizedBackBtn(navigationController: self.navigationController, navigationItem: self.navigationItem)

6

Le piratage simple d'iOS6 fonctionne également sur iOS7:

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

Edit: N'utilisez pas ce hack. Voir le commentaire pour plus de détails.


6
N'utilisez pas ce hack. Il y a un bogue dans le code d'Apple sur les appareils 64 bits qui empêchera les vues modales d'apparaître lorsque vous effectuez un décalage de titre de bouton de barre. Plus de détails .
zh.

Eh bien, il n'y avait que des problèmes sur l'appareil, pas sur le simulateur.
zh.

Ce hack ne fonctionne plus lorsqu'il est construit avec Xcode 9 / iOS 11. Le "<" apparaîtra trop bas et vous verrez des contraintes brisées lors de son exécution dans le débogueur.
T'Pol

3

vous pouvez l'utiliser. Cela fonctionne parfaitement pour moi en ajoutant simplement UIButtonune vue personnalisée pour leUIBarButtonItem .

Essayez le code ci-dessous

    self.navigationItem.leftBarButtonItem=[self backButton];


- (UIBarButtonItem *)backButton
{
    UIImage *image = [UIImage imageNamed:@"back-btn.png"];
    CGRect buttonFrame = CGRectMake(0, 0, image.size.width, image.size.height);

    UIButton *button = [[UIButton alloc] initWithFrame:buttonFrame];
    [button addTarget:self action:@selector(backButtonPressed) forControlEvents:UIControlEventTouchUpInside];
    [button setImage:image forState:UIControlStateNormal];

    UIBarButtonItem *item= [[UIBarButtonItem alloc] initWithCustomView:button];

    return item;
}

3
cependant, cela désactivera le mouvement de balayage arrière dans iOS 7
user102008

3

Créez un UILabelavec le titre que vous souhaitez pour votre contrôleur de vue racine et affectez-le au contrôleur de vue navigationItem.titleView.

Maintenant, définissez le titre sur une chaîne vide et le prochain contrôleur de vue que vous appuyez aura un bouton de retour sans texte.

self.navigationItem.titleView = titleLabel; //Assuming you've created titleLabel above
self.title = @"";

3
 // add left bar button item

try this code:

- (void)viewDidLoad
{ 
    [super viewDidLoad];

   UIImage* image_back = [UIImage imageNamed:@"your_leftarrowImage.png"];
    CGRect backframe = CGRectMake(250, 9, 15,21);
    UIButton *backbutton = [[UIButton alloc] initWithFrame:backframe];
    [backbutton setBackgroundImage:image_back forState:UIControlStateNormal];
    [backbutton addTarget:self action:@selector(Btn_back:)
         forControlEvents:UIControlEventTouchUpInside];
    [backbutton setShowsTouchWhenHighlighted:YES];
    UIBarButtonItem *backbarbutton =[[UIBarButtonItem alloc] initWithCustomView:backbutton];
    self.navigationItem.leftBarButtonItem=backbarbutton;
    [backbutton release];

}
-(IBAction)Btn_back:(id)sender
{
    [self.navigationController popViewControllerAnimated:YES];

}

3

Toutes les réponses ne résolvent pas le problème. Il n'est pas acceptable de reculer le titre du bouton dans chaque contrôleur de vue et l'ajout d'un décalage au titre fait toujours passer le titre du contrôleur de vue vers la droite.

Voici la méthode utilisant la méthode swizzling, il suffit de créer une nouvelle extension pour UINavigationItem

import UIKit

extension UINavigationItem {
    public override class func initialize() {

    struct Static {
        static var token: dispatch_once_t = 0
    }

    // make sure this isn't a subclass
    if self !== UINavigationItem.self {
        return
    }

    dispatch_once(&Static.token) {
        let originalSelector = Selector("backBarButtonItem")
        let swizzledSelector = #selector(UINavigationItem.noTitleBackBarButtonItem)

        let originalMethod = class_getInstanceMethod(self, originalSelector)
        let swizzledMethod = class_getInstanceMethod(self, swizzledSelector)

        let didAddMethod = class_addMethod(self, originalSelector, method_getImplementation(swizzledMethod), method_getTypeEncoding(swizzledMethod))

        if didAddMethod {
            class_replaceMethod(self, swizzledSelector, method_getImplementation(originalMethod), method_getTypeEncoding(originalMethod))
        } else {
            method_exchangeImplementations(originalMethod, swizzledMethod)
        }
    }
}

// MARK: - Method Swizzling

struct AssociatedKeys {
    static var ArrowBackButtonKey = "noTitleArrowBackButtonKey"
}

func noTitleBackBarButtonItem() -> UIBarButtonItem? {
    if let item = self.noTitleBackBarButtonItem() {
        return item
    }

    if let item = objc_getAssociatedObject(self, &AssociatedKeys.ArrowBackButtonKey) as? UIBarButtonItem {
        return item
    } else {
        let newItem = UIBarButtonItem(title: " ", style: UIBarButtonItemStyle.Plain, target: nil, action: nil)
        objc_setAssociatedObject(self, &AssociatedKeys.ArrowBackButtonKey, newItem as UIBarButtonItem?, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
        return newItem
    }
}
}

Réglez le bouton de retour sur le mot retour, fonctionne très bien: self.navigationItem.backBarButtonItem.title = @ "Back";
Mike Zriel

Que voulez-vous dire mon pote? La question était de supprimer le texte du bouton de retour?
jakub wolanski

1
Beaucoup d'applications et d'Apps propres à Apple disent "<Retour", il est donc bon de s'en tenir à la norme. BigTakeAway et JustEat.
Mike Zriel

2

J'ai appliqué le code suivant dans viewDidLoad et cela fonctionne:

  // this will set the back button title
self.navigationController.navigationBar.topItem.title = @"Test";

 // this line set the back button and default icon color  

//[[self.navigationController.navigationBar.subviews lastObject] setTintColor:[UIColor blackColor]];

this line change the back default icon to your custom icon
[[self.navigationController.navigationBar.subviews lastObject] setTintColor:[UIColor colorWithPatternImage:[UIImage imageNamed:@"menuicon"]]];

Juste pour mettre à jour, j'utilise Vector Icon


2

Vous pouvez sous-classer UINavigationController, se définir en tant que délégué et définir le backBarButtonItem dans la méthode déléguée navigationController:willShowViewController:animated:

@interface Custom_NavigationController : UINavigationController <UINavigationControllerDelegate>

@end

@implementation Custom_NavigationController

- (void)viewDidLoad
{
    [super viewDidLoad];

    self.delegate = self;
}

#pragma mark - UINavigationControllerDelegate

- (void)navigationController:(UINavigationController *)navigationController     willShowViewController:(UIViewController *)viewController animated:(BOOL)animated
{
    viewController.navigationItem.backBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"" style:UIBarButtonItemStylePlain target:nil action:nil];
}

@end

2

Reculer le titre vide

UIBarButtonItem *backButton = [[UIBarButtonItem alloc] initWithTitle:@""  style:UIBarButtonItemStyleDone target:self action:@selector(handleBack:)];
[backButton setTintColor:Color_WHITE];
[self.navigationItem setBackBarButtonItem:backButton];

Changer l'image de retour

 UIImage *backImg = [[UIImage imageNamed:@"ic_back_white"] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
[UINavigationBar appearance].backIndicatorImage = backImg;
[UINavigationBar appearance].backIndicatorTransitionMaskImage = backImg;

1

J'utilise cette solution depuis iOS 5 environ sans aucun problème. J'ai créé une fonction utilitaire que j'appelle dans mes contrôleurs de vue. Vous devez le faire dans viewDidLoad ou à tout moment après cela.

void updateBackButtonTextForViewController(UIViewController *viewController, NSString *text)
{
    if(! viewController.navigationItem.backBarButtonItem)
    {
        viewController.navigationItem.backBarButtonItem =
        [[UIBarButtonItem alloc] initWithTitle:text
                                         style:UIBarButtonItemStylePlain
                                        target:nil action:nil];
    }
    else
    {
        viewController.navigationItem.backBarButtonItem.title = text;
    }
}

Dans certains cas, l'élément de navigation peut déjà exister, dans d'autres cas, il doit être créé. Cela représente ces deux cas sans jouer avec le titre de l'élément de navigation. Il vous permet de supprimer le titre en passant simplement @"".


1
Ceci est la bonne réponse. Pas de trucs. Il s'agit simplement d'utiliser l'API iOS de la manière dont elle devait être utilisée, pour définir le titre. Réglez-le sur @ "" pour supprimer le titre (testé et fonctionne correctement).
n13

1

La seule façon qui a fonctionné pour moi était:

navigationController?.navigationBar.backItem?.title = ""

METTRE À JOUR:

Lorsque j'ai changé le drapeau d'animation de séquence en true (c'était faux auparavant), la seule façon qui fonctionnait pour moi était:

navigationController?.navigationBar.topItem?.title = ""

1

Si vous avez deux ViewController (FirstVC, SecondVC) Embed dans le contrôleur de navigation et que vous voulez qu'il n'y ait qu'une flèche de retour dans SecondVC.

Vous pouvez essayer ceci dans le ViewDidLoad de FirstVC

override func viewDidLoad() {
    super.viewDidLoad()
    self.navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .Plain, target: nil, action: nil)
}

Ensuite, lorsque vous poussez dans SecondVC, vous verrez la seule flèche de retour


1

Si vous définissez tintColor Of NavigationBar, ajoutez une image de bouton de retour personnalisé sans titre, cette couleur de teinte reflétera la couleur de l'image. Veuillez suivre ce lien de documentation d'Apple.

https://developer.apple.com/library/content/documentation/UserExperience/Conceptual/UIKitUICatalog/index.html#//apple_ref/doc/uid/TP40012857-UIView-SW7

UINavigationItem *navItem = [[UINavigationItem alloc] init];
   navBar.tintColor = self.tintColor;

   UIImage *myImage = [UIImage imageNamed:@"left_arrow.png"];
     myImage = [myImage              imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate];

     UIBarButtonItem *leftButton = [[UIBarButtonItem alloc] initWithImage:myImage style:UIBarButtonItemStylePlain target:self action:@selector(cancelButtonFunction:)];
     navItem.leftBarButtonItem = leftButton;

    navBar.items = @[ navItem ];


1

J'ai écrit une extension pour rendre cela plus facile:

extension UIViewController {

    /// Convenience for setting the back button, which will be used on any view controller that this one pushes onto the stack
    @objc var backButtonTitle: String? {
        get {
            return navigationItem.backBarButtonItem?.title
        }
        set {
            if let existingBackBarButtonItem = navigationItem.backBarButtonItem {
                existingBackBarButtonItem.title = newValue
            }
            else {
                let newNavigationItem = UIBarButtonItem(title: newValue, style:.plain, target: nil, action: nil)
                navigationItem.backBarButtonItem = newNavigationItem
            }
        }
    }

}

1

Vous pouvez changer le titre en @ "" du ViewController actuel sur viewWillDisappear, et quand il est sur le point d'afficher à nouveau, redéfinissez le titre sur ce qu'il était auparavant.

-(void) viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];
    self.title = @"Previous Title";
}

-(void) viewWillDisappear:(BOOL)animated {
    [super viewWillDisappear:animated];
    self.title = @"";
}

0

Dans la méthode prepareForSegue: de votre premier ViewController, vous définissez le titre de ces vues 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.


Voir ma réponse pour la bonne solution sans jouer avec le titre de l'élément de navigation.
Dima

Votre solution conserve-t-elle la flèche arrière iOS7? J'ai essayé quelque chose de similaire mais cela a supprimé la flèche.
Alejandro Figueroa

Il garde la flèche arrière dans iOS 7, oui. Dans iOS 6, le fait de passer une chaîne vide (longueur 0) supprimera également complètement le bouton, donc cette opération n'est vraiment bonne que pour iOS 7.
Dima

Il existe une solution très simple. Voyez si ma réponse vous convient.
Guto Araujo

0

Pour ajouter à la réponse de Thomas C ci-dessus, mettre parfois un seul espace ne fonctionne pas et vous devez continuer à ajouter des espaces.

bouton de barre vide

Vous saurez que vous avez réussi lorsque vous verrez «Bar Button Item -» sous «Navigation Item». C'est dans le plan du document (Editeur-> Afficher le plan du document). Une fois que vous voyez l'image ci-dessus, vous pouvez supprimer quelques espaces et voir si cela fonctionne toujours.


0
- (id)initWithCoder:(NSCoder *)aDecoder
{
    self = [super initWithCoder:aDecoder];
    if (self) {
        // Custom initialization
        self.navigationItem.backBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"" style:UIBarButtonItemStylePlain target:nil action:nil];

    }
    return self; 
}

Tout comme Kyle Begeman, vous ajoutez le code ci-dessus à votre contrôleur de vue racine. Tout le contrôleur de sous-vue sera appliqué. De plus, en ajoutant ceci dans la méthode initWithCoder:, vous pouvez appliquer le style pour les contrôleurs de vue racine dans les approches basées sur xib, storyboard ou code.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.