web-dev-qa-db-fra.com

navigationItem.backBarButtonItem ne fonctionne pas? Pourquoi le menu précédent est-il toujours affiché comme bouton?

Essayer de personnaliser mon bouton de retour dans un contrôleur de navigation en profondeur.

Sur mon contrôleur de vue unique, j'ai un bouton Ajouter dans lequel le code génère par programme une nouvelle variable UIViewController:

- (void)add:(id)sender 
{
    MyAddViewController *addController = [[MyAddViewController alloc] initWithNibName:@"MyAddViewController" bundle:nil];

    [self.navigationController pushViewController:addController animated:YES];

    [addController release];
}

Cela fonctionne et lorsque je clique sur le bouton Ajouter, il se glisse dans la nouvelle vue. Dans la méthode viewDidLoad de MyAddViewController.m, j'ai:

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

Mais ça ne marche pas. Le bouton Précédent du contrôleur de navigation reste le titre du contrôleur de la vue précédente sur la pile. Il semble que cette ligne ne fait rien. Ai-je manqué quelque chose?

Merci

23
skålfyfan

Cela ne fonctionnera que sur chaque enfant après le viewController qui a self.navigationItem.backBarButtonItem.

27
WrightsCS

self.navigationItem.backBarButtonItem est pour le bouton de retour qui apparaît sur la vue poussée par le contrôleur de vue. Vous devez donc déplacer cette ligne vers le contrôleur de vue précédent.

47
benwong

Vous confondez la backBarButtonItem et la leftBarButtonItem. Dans UINavigationItem docs on backBarButtonItem:

Lorsque cet élément est l'élément arrière du fichier barre de navigation — quand c'est le prochain item en-dessous de l'article le plus haut - cela peut être représenté comme un bouton de retour sur le barre de navigation. Utilisez cette propriété pour spécifiez le bouton retour. La cible et action de l’élément de bouton de barre arrière vous définissez devrait être nul. Le défaut valeur est un élément de bouton de barre affichant le titre de l'élément de navigation.

Donc, si vous deviez changer:

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

À:

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

Je crois que vous obtiendrez l'effet souhaité.

11
Matt Wilding

Vous ne pouvez pas remplacer la backBarButtonItem, mais vous pouvez utiliser la leftBarButtonItem pour la remplacer. Mais pour que le nouveau bouton fonctionne de la même manière que le bouton Précédent, vous devez définir la cible et l’action du nouveau bouton, comme suit:

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

- (void)viewDidLoad {
    [super viewDidLoad];
    self.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc]
        initWithTitle:@"Quit" style: UIBarButtonItemStyleBordered
        target:self action:@selector(dismissMyView)];
}
5
Greg Young

Si ViewController A pousse ViewController B pendant ce temps, nous voulons définir le titre du bouton de barre arrière, nous devons définir "self.navigationItem.backBarButtonItem = ..". S'il était défini dans ViewController B, cela ne fonctionnerait pas comme nous le voudrions.

0
lynulzy