Question

Actuellement, la valeur par défaut de bouton barre de gauche est le titre de la vue qui a chargé l'actuel, autrement dit la vue à afficher lorsque le bouton est enfoncé (bouton retour).

Je souhaite modifier le texte affiché sur le bouton à autre chose.

J'ai essayé de mettre la ligne de code suivante dans la méthode viewDidLoad du contrôleur de vue, mais il ne semble pas fonctionner.

self.navigationItem.leftBarButtonItem.title = @"Log Out";

Que dois-je faire?

Merci.

Était-ce utile?

La solution

Il doit être placé dans la méthode qui appelle la ViewController intitulée « newTitle ». Juste avant la déclaration de poussée ou popViewController.

UIBarButtonItem *newBackButton = 
        [[UIBarButtonItem alloc] initWithTitle:@"NewTitle" 
                                         style:UIBarButtonItemStyleBordered 
                                        target:nil 
                                        action:nil];
[[self navigationItem] setBackBarButtonItem:newBackButton];
[newBackButton release];

Autres conseils

En ChildVC cela a fonctionné pour moi ...

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

Travaux à Swift aussi!

self.navigationController!.navigationBar.topItem!.title = "Back"

Voici la documentation de backBarButtonItem :

  

"Lorsque cet élément de navigation est juste en dessous de l'élément supérieur dans la   pile, le dispositif de commande de navigation tire le bouton de retour pour la   barre de navigation de cet élément de navigation. [...] Si tu veux   spécifiez une image personnalisée ou un titre pour le bouton de retour, vous pouvez attribuer un   article personnalisé bouton de la barre (avec votre titre ou de l'image personnalisée) à cette   propriété à la place. "

View Controller A ( "parent" contrôleur de vue):

self.title = @"Really Long Title";
UIBarButtonItem *backButton = [[UIBarButtonItem alloc] initWithTitle:@"Short" style:UIBarButtonItemStyleBordered target:nil action:nil];
self.navigationItem.backBarButtonItem = backButton;

Si aucun autre contrôleur de vue B est sur le dessus de la pile de navigation, et A est juste en dessous, B bouton de retour d ' aura le titre "Short" .

dans Xcode 4.5 en utilisant story-board, de loin la solution la plus simple que j'ai trouvé lorsque la valeur du bouton Retour ne pas modifier dynamiquement utiliser le champ « Bouton Retour » associé à l'élément de navigation du contrôleur Voir à laquelle vous voulez que le bouton « Retour » pour dire autre chose.

par exemple. dans la capture d'écran ci-dessous, je veux que le bouton Précédent pour le contrôleur de vue (s) que je pousser à avoir « Retour », comme le titre du bouton Retour.

entrer image description ici

Bien sûr, cela ne fonctionnera pas si vous avez besoin le bouton précédent pour dire quelque chose de légèrement différent à chaque fois ... il y a toutes les autres solutions ici pour cela.

Je sais, la question est très ancienne, mais j'ai trouvé une belle solution.

UIBarButtonItem *barButton = [[UIBarButtonItem alloc] init];
barButton.title = @"Custom Title";
self.navigationController.navigationBar.topItem.backBarButtonItem = barButton;

Travaux de ChildView! Testé avec iOS 7.

Peut-être que je suis être trop simpliste, mais de la documentation d'Apple le libellé est:

  

Si personnalisée barre élément n'est pas spécifié par l'une des contrôleurs de vue, un bouton par défaut retour est utilisé et son titre est fixé à la valeur du titre propriété de la vue précédente contrôleur qui est, le contrôleur de vue un niveau plus bas dans la pile.

La solution correcte marquée met au-dessus d'un élément de bouton par défaut à partir du contrôleur de parent. Il est la bonne réponse, mais je résoudre le problème en modifiant la propriété self.title du UIViewController avant de le pousser le nouveau contrôleur sur la pile NavigationController.

Cela met à jour automatiquement le titre du bouton de retour sur le prochain contrôleur, et aussi longtemps que vous définissez self.title à ce qu'elle devrait être dans viewWillAppear je ne vois pas cette méthode causer trop de problèmes.

Ce travail mieux pour moi. Essayez:

 self.navigationController.navigationBar.topItem.backBarButtonItem = [[UIBarButtonItem alloc] 
initWithTitle:@"Back" style:UIBarButtonItemStylePlain target:nil action:nil];

Dans Swift / iOS8, ce qui suit a fonctionné pour moi:

let backButton = UIBarButtonItem(
      title: "Back Button Text",
      style: UIBarButtonItemStyle.Bordered,
      target: nil,
      action: nil
);

self.navigationController.navigationBar.topItem.backBarButtonItem = backButton;

Ported de la réponse de Felipe.

Ok, est le chemin. Si vous avez un contrôleur de vue « premier » et vous naviguez un autre contrôleur de vue « seconde » en appuyant sur un bouton ou etc, vous devez faire un certain travail. D'abord, vous devez créer un BarButtonItem dans « deuxième » contrôleur de vue de la méthode viewDidLoad comme celui-ci;

    UIBarButtonItem *btnBack = [[UIBarButtonItem alloc]
                                   initWithTitle:@"Back" 
                                   style:UIBarButtonItemStyleBordered
                                   target:self
                                   action:@selector(OnClick_btnBack:)];
    self.navigationItem.leftBarButtonItem = btnBack;
    [btnBack release];

Une fois que vous faites cela, vous devez écrire le code pour l'action « btnBack » dans le même fichier .m comme celui-ci;

-(IBAction)OnClick_btnBack:(id)sender  {
      [self.navigationController popViewControllerAnimated:YES];
    //[self.navigationController pushViewController:self.navigationController.parentViewController animated:YES];
}

C'est tout.

J'ai eu un contrôleur de vue parent avec un titre très long. Il en est résulté le texte du bouton de retour de saignement dans le titre du contrôleur de vue de l'enfant.

Après avoir essayé un tas de différentes solutions, ce que je fini par faire (expansion sur l'approche @ de john.k.doe):

En utilisant Xcode 7.2, Swift 2

  1. Dans le Storyboard, ajouter un Navigation Item à Parent Voir scène Controller (pas le VC enfant)

navigation item

  1. Sur la Attributes Inspector de votre nouveau Navigation Item, tapez un caractère space dans le domaine de Back Button. Plus sur le sujet plus tard.

navigation élément dans la vue hiérarchie

ajouter un espace dans le champ Bouton Retour

  1. Dans le Parent contrôleur de vue, ajoutez le code suivant:

extrait:

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
    switch segue.destinationViewController {
    case is ChildViewController:
        navigationItem.backBarButtonItem?.title = ""
    default:
        navigationItem.backBarButtonItem?.title = "Full Parent Title"
    }
}

Explication:

Le bouton de retour appartient en quelque sorte au contrôleur de vue parent. Le Navigation Item vous donne une poignée sur le bouton de retour, de sorte que vous pouvez définir le titre dans le code ou dans le storyboard.

Remarque:

Si vous laissez le texte Navigation Item de Back Button par défaut une chaîne vide, le titre du bouton de retour deviendra « Retour ».

D'autres approches fonctionnent, pourquoi utiliser celui-ci:

Bien qu'il soit possible de remplacer le titre du bouton de retour sur le contrôleur de vue de l'enfant, il était un défi d'obtenir une poignée jusqu'à ce qu'il avait déjà flashé brièvement à l'écran.

Certaines des approches construire un nouveau bouton en arrière et remplacer les existant. Je suis sûr que cela fonctionne, et probablement nécessaire dans certains cas d'utilisation. Mais je préfère tirer parti des API existantes lorsque cela est possible.

Modification du title du contrôleur de vue parent est la solution la plus rapide pour certaines situations. Cependant, cela change le titre de parent, donc vous devez gérer l'état. Les choses deviennent aussi en désordre avec un Tab Bar Controller parce que les changements de titre provoquent des effets secondaires avec les titres de Tab Bar Item.

Pour ceux qui utilisent storyboards il suffit de sélectionner le parent (pas celui qui tient vue cible) vue cadre du contrôleur (assurez-vous d'un clic droit sur la barre de navigation, puis inspecteur des attributs ouverts, où vous trouverez trois entrées de formulaire. La troisième « bouton de retour » est que nous recherchons.

Version Swift:

Dans votre enfant ViewController:

override func viewWillAppear(animated: Bool) {
    super.viewWillAppear(animated)
    self.navigationController?.navigationBar.backItem?.title = "TEXT"
}

Voici une autre façon de le faire.

Dans votre contrôleur de vue parent, mettre en œuvre la méthode suivante:

- (void) setBackBarButtonItemTitle:(NSString *)newTitle {
  self.navigationItem.backBarButtonItem.title = newTitle;
}

Dans votre contrôleur de vue de l'enfant, lorsque vous voulez changer le titre, cela fonctionnera:

NSArray *viewControllerArray = [self.navigationController viewControllers];
int parentViewControllerIndex = [viewControllerArray count] - 2;
[[viewControllerArray objectAtIndex:parentViewControllerIndex] setBackBarButtonItemTitle:@"New Title"];

Je n'ai jamais pu obtenir la propriété parentViewController au travail:

[(ParentViewController *)(self.navigationController.parentViewController) setBackBarButtonItemTitle:@"New Title"];

Je ne sais pas si c'est un bug ou je ne suis pas l'utiliser correctement. Mais saisissant la deuxième avant-dernier contrôleur de vue dans les points de tableau de viewControllers au contrôleur de vue parent, et je peux bien appeler des méthodes mères avec cette référence.

ok

. Je détestais personnellement toutes ces options. Par conséquent, je suis venu avec moi-même.

D'après les informations que je l'ai vu. Il semble que le contrôleur de vue précédente est en contrôle de son propre bouton « Back » qui sera présenté sur le contrôleur de vue poussé.

Je l'ai créé une méthode de chargement Lazy pour le navigationItem sur le contrôleur qui veut le bouton remettais.

mine est un contrôleur acheteur Inviter

Invite l'acheteur est le texte qui est défini par défaut.

mais le bouton de retour nécessaire pour être invité

Voici le code que j'utilisé pour créer le bouton de retour.

Je mis ce code dans la partie supérieure du dossier Implementatio (.m) du contrôleur et l'emportaient sur automatiquement la méthode de super.

- (UINavigationItem *)navigationItem{
    UINavigationItem *item = [super navigationItem];
    if (item != nil && item.backBarButtonItem == nil)
    {
        item.backBarButtonItem = [[[UIBarButtonItem alloc] init] autorelease];
        item.backBarButtonItem.title = @"Invite";
    }

    return item;
}

Je me sens c'est une façon beaucoup plus élégante pour ce faire.

Je place ce code dans un seul endroit, et il est automatiquement peuplé en cas de besoin.

Pas besoin d'appeler le code avant chaque demande de poussée.

Hope this helps

UIBarButtonItem *btnBack = [[UIBarButtonItem alloc]
                                   initWithTitle:@"Back" 
                                   style:UIBarButtonItemStyleBordered
                                   target:self
                                   action:@selector(OnClick_btnBack:)];
    self.navigationItem.leftBarButtonItem = btnBack;
    [btnBack release];

Voici la réponse:

Dans viewDidAppear:animated (pas dans viewDidLoad), procédez comme suit

- (void)viewDidAppear:(BOOL)animated
{
     [self.navigationController.navigationBar.backItem setTitle:@"anything"];

     // then call the super
     [super viewDidAppear:animated];
}

Que si vous voulez garder la forme du bouton retour.

Aucune des solutions décrites ici a fonctionné pour moi. Donc, ce que je faisais était supprimer le titre de la scène où je venais de la façon suivante:

self.title = @"";

Alors, quand nouvelle scène est présenté le texte de retour ne semble pas.

Je suis d'accord Absoluty que ce n'est pas une solution claire du tout, mais travaillé et aucun des Explained a fonctionné pour moi.

Pour Swift:

    // Rename back button
    let backButton = UIBarButtonItem(
        title: "Back",
        style: UIBarButtonItemStyle.Plain, // Note: .Bordered is deprecated
        target: nil,
        action: nil
    )
    self.navigationController!.navigationBar.topItem!.backBarButtonItem = backButton

J'ai trouvé que la meilleure façon de changer le nom du bouton de retour est de définir le titre vue des contrôleurs au titre du bouton de retour, puis remplacer le titleview dans la vue des contrôleurs élément de navigation à une étiquette personnalisée avec son vrai nom.

Comme ceci:

CustomViewController.m

@implementation CustomViewController

- (NSString*)title {
    return @"Back Button Title";
}

- (void)viewDidLoad {
    [super viewDidLoad];
    UILabel* customTitleView = [[UILabel alloc] initWithFrame:CGRectZero];
    customTitleView.text = @"Navigation Bar Title";
    customTitleView.font = [UIFont boldSystemFontOfSize:20];
    customTitleView.backgroundColor = [UIColor clearColor];
    customTitleView.textColor = [UIColor whiteColor];
    customTitleView.shadowColor = [UIColor colorWithRed:0.0 green:0.0 blue:0.0 alpha:0.5];
    customTitleView.shadowOffset = CGSizeMake(0, -1);

    [customTitleView sizeToFit];

    self.navigationItem.titleView = [customTitleView autorelease];
}

@end

Cela rendra votre titre dans UINavigationBar regarder comme si elle était originaire. Donner le contrôleur de vue la possibilité d'avoir le titre et le titre seperated de bouton retour.

Dans le cas du contrôleur de vue A et B, A est responsable de dire comment il est bouton de retour devrait regarder, tandis que B est affiché.

EDIT: Cela maintient également le bouton de retour apparence native (Le bouton de la barre fléchée gauche de l'article)

.

Ce code fonctionne aussi. Mettre cela sur le contrôleur racine du contrôleur de navigation:

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

Je l'ai trouvé qu'il est préférable de changer le titre du contrôleur de vue en cours dans la pile de navigation sur le texte de votre choix du bouton de retour avant de pousser au contrôleur suivant la vue.

Par exemple

self.navigationItem.title = @"Desired back button text";
[self.navigationController pushViewController:QAVC animated:NO];

Ensuite, dans le viewDidAppear définir le titre de retour au titre de votre choix pour le VC d'origine. Le tour est joué!

Im nouveau dans iOS mais je vais donner ma réponse très simple de passer outre la classe de contrôleur de navigation. Je override simple, les poussoirs et les méthodes pop et enregistrer le titre de contrôleur de vue précédent. Désolé pour coller dans le bloc js. Était peu confus comment il passé dans le bloc normal code.

#import "MyCustomNavController.h"


@implementation MyCustomNavController {

    NSString *_savedTitle;
}

- (void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated withBackBtnTitle:(NSString *)title {
    _savedTitle = self.topViewController.title;

    self.topViewController.title = title;
    [super pushViewController:viewController animated:animated];
}

- (UIViewController *)popViewControllerAnimated:(BOOL)animated {

    [self.viewControllers objectAtIndex:self.viewControllers.count - 2].title = _savedTitle;
    return [super popViewControllerAnimated:animated];
}

@end

self.navigationController.navigationBar.backItem.title = @"TEXT";

Et à Swift:

self.navigationController?.navigationBar.backItem?.title = "TEXT"
self.navigationItem.backBarButtonItem = [[[UIBarButtonItem alloc] 
                                              initWithTitle:@"Log out" 
                                              style:UIBarButtonItemStyleDone 
                                              target:nil 
                                              action:nil] autorelease];

vous pouvez le mettre whereever que vous aimez dans le code dans le contrôleur Parrent, que vous allowes d'avoir differenct backbuttons pour différents points de vue de l'enfant.

La plupart des solutions tue le style original de BackButton (La gauche fléchée bouton bar), tout en ajoutant un bouton d'habitude avec le titre désiré.
Donc, pour garder le style original il y a 2 façons:
1er: Pour utiliser le style de bouton sans papier (110 ou quelque chose comme ça) que je préfère ne pas faire. Mais si vous voulez, vous pouvez trouver comment le faire ici, sur stackoverflow.
2: Pour que j'utiliser l'idée du Trenskow. Je l'ai aimé et je l'utilise un peu changé.
Au lieu de passer outre - (NSString *) titre que j'ai décidé de garder le titre original de la manière suivante (ce qui me permet d'utiliser les titres de nib ainsi que le titre donné à l'état push BTW)

.
- (void)viewDidLoad {
    [super viewDidLoad];
    static NSString * backButtonTitle=@"Back"; //or whatever u want

    if (![self.title isEqualToString:backButtonTitle]){

        UILabel* customTitleView = [[UILabel alloc] initWithFrame:CGRectZero];
        customTitleView.text = self.title; // original title
        customTitleView.font = [UIFont boldSystemFontOfSize:20];
        customTitleView.backgroundColor = [UIColor clearColor];
        customTitleView.textColor = [UIColor whiteColor];
        customTitleView.shadowColor = [UIColor colorWithRed:0.0 green:0.0 blue:0.0 alpha:0.5];
        customTitleView.shadowOffset = CGSizeMake(0, -1);

        [customTitleView sizeToFit];

        self.navigationItem.titleView = [customTitleView autorelease];
        self.title = backButtonTitle; 
    }
}

Cette solution fonctionne bien et il semble natif. De plus, si l'utiliser dans la méthode viewDidLoad empêche l'exécution plus de 1 fois.
Aussi j'ai essayé une solution de Jessedc mais il semble mauvais. Il provoque le changement visible barre de titre utilisateur à la volée de l'original à BackButton de choix et le dos.

Cela fonctionne pour moi comme une version « simplifiée » des réponses affichées précédentes.

UIBarButtonItem *backButton = [[UIBarButtonItem alloc] init];

backButton.title = @"Go Back";

self.navigationItem.backBarButtonItem = backButton;

Rappelez-vous de mettre le code à l'intérieur du contrôleur de vue parent (par exemple le point de vue qui a votre point de vue de la table ou UITableViewController), pas la vue des enfants ou des détails (par exemple UIViewController).

Vous pouvez facilement localiser la chaîne de bouton retour comme ceci:

backButton.title = NSLocalizedString(@"Back Title", nil);

Nous avons A et B de deux VC.

Si vous voulez changer le titre en B, écrire ce code dans A

- (IBAction)goToBViewController:(UIButton *)sender {

    BViewController *vc = [self.storyboard instantiateViewControllerWithIdentifier:@"VC"];
    UIBarButtonItem *newBackButton = [[UIBarButtonItem alloc] initWithTitle:@"Your title here"
                                                                  style:UIBarButtonItemStylePlain
                                                                 target:nil
                                                                 action:nil];
    [[self navigationItem] setBackBarButtonItem:newBackButton];
    [self.navigationController pushViewController:vc animated:NO];

}

Swift 4.1 Xcode 9.4

let secondViewController = self.storyboard?.instantiateViewController(withIdentifier: "VC"])
let newBackButton = UIBarButtonItem.init(title: "Your title here", style: UIBarButtonItemStyle.plain, target: nil, action: nil)
navigationController?.navigationBar.topItem?.backBarButtonItem = newBackButton
navigationController?.pushViewController(secondViewController!, animated: true)

La réponse de Stan était le meilleur. Mais il a aussi un problème, lorsque vous utilisez le contrôleur avec un barre d'onglets et de modifier le titre du contrôleur, vous pouvez changer le titre de l'onglet Barre too.So la meilleure réponse est de changer le view_controller.navigationItem.title seulement et utiliser le view_controller.navigationItem .title dans la fonction. La réponse est ici: (avec l'ARC et les ajouter dans viewDidLoad vue)

  static NSString * back_button_title=@"Back"; //or whatever u want
  if (![view_controller.navigationItem.title isEqualToString:back_button_title]){
    UILabel* custom_title_view = [[UILabel alloc] initWithFrame:CGRectZero];
    custom_title_view.text = view_controller.navigationItem.title; // original title
    custom_title_view.font = [UIFont boldSystemFontOfSize:20];
    custom_title_view.backgroundColor = [UIColor clearColor];
    custom_title_view.textColor = [UIColor whiteColor];
    custom_title_view.shadowColor = [UIColor colorWithRed:0.0 green:0.0 blue:0.0 alpha:0.5];
    custom_title_view.shadowOffset = CGSizeMake(0, -1);

    [custom_title_view sizeToFit];

    view_controller.navigationItem.titleView = custom_title_view;
    view_controller.navigationItem.title = back_button_title;
  }

utilise moi-même, je fais une fonction comme ça, juste avoir la fonction d'un code de ligne dans le viewDidLoad.

+ (void)makeSubViewHaveBackButton:(UIViewController*) view_controller{
  static NSString * back_button_title=@"Back"; //or whatever u want
  if (![view_controller.navigationItem.title isEqualToString:back_button_title]){
    UILabel* custom_title_view = [[UILabel alloc] initWithFrame:CGRectZero];
    custom_title_view.text = view_controller.navigationItem.title; // original title
    custom_title_view.font = [UIFont boldSystemFontOfSize:20];
    custom_title_view.backgroundColor = [UIColor clearColor];
    custom_title_view.textColor = [UIColor whiteColor];
    custom_title_view.shadowColor = [UIColor colorWithRed:0.0 green:0.0 blue:0.0 alpha:0.5];
    custom_title_view.shadowOffset = CGSizeMake(0, -1);

    [custom_title_view sizeToFit];

    view_controller.navigationItem.titleView = custom_title_view;
    view_controller.navigationItem.title = back_button_title;
  }
}

Si vous voulez non seulement changer le texte du bouton Retour au même texte et restent la forme originale flèche gauche, mais aussi de faire quelque chose lorsque l'utilisateur clique sur le bouton Précédent, je vous recommande de jeter un oeil autour de mon " CustomNavigationController ".

PROBLÈME:. Texte « Retour » dans la barre de navigation ne peut pas être remplacé

RAISON:. Label « Retour » est situé dans la barre de navigation après avoir poussé une vue parce que l'attribut .title dans le contrôleur de vue parent a été fixé à zéro (ou non initialisés)

UNE SOLUTION:. Si vous définissez self.title = « Quelle que soit ... », vous verrez qu'au lieu de « Retour » apparaît « Peu importe ... » après avoir poussé nouveau contrôleur de vue

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top