web-dev-qa-db-fra.com

Créer un bouton gauche personnalisé sur UINavigationBar AVEC la flèche standard à gauche

Lorsque je crée un bouton de retour personnalisé, j'utilise le code suivant:

    UIBarButtonItem *leftButton = [[UIBarButtonItem alloc]initWithTitle:@"Yeah" style:UIBarButtonItemStyleBordered target:self action:@selector(backButtonPressed:)];
self.navigationItem.leftBarButtonItem = leftButton;

Cela fonctionne bien et j'obtiens ce résultat:

Screenshot of the Word 'Details' where the back button would normally be.

J'aurais le même résultat, mais avec une flèche à gauche, comme ceci (quand c'est un bouton de retour standard, pas un bouton personnalisé):

Screenshot of the standard back arrow followed by the Word 'Details'.

Comment puis-je simplement ajouter cette flèche?

19
Erzékiel

Enfin, voici l'extrait de code que j'utilise pour définir le titre du bouton Précédent avec la flèche vers la gauche standard dans la vue actuelle, et non dans la vue parent:

- (void)viewDidLoad {
    [super viewDidLoad];

    [self setTitle:@"Current View"];

    // Get the previous view controller
    UIViewController *previousVC = [self.navigationController.viewControllers objectAtIndex:self.navigationController.viewControllers.count - 2];

    // Create a UIBarButtonItem
    UIBarButtonItem *barButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"FooBar" style:UIBarButtonItemStyleBordered target:self action:@selector(yourSelector)];

    // Associate the barButtonItem to the previous view
    [previousVC.navigationItem setBackBarButtonItem:barButtonItem];
}

Voici le résultat:

enter image description here

Note: Cependant, comme il n'est pas possible d'ajouter une action sur un backBarButtonItem, vous pouvez faire référence à cet excellent post si vous le souhaitez.

Mis à jour pour Swift

// Prev - no chevron...
//navigationItem.leftBarButtonItem = UIBarButtonItem(title: "Back !", style: .plain, target: self, action: #selector(backPressed))

// adds the chevron
let vc = navigationController?.viewControllers.first
let button = UIBarButtonItem(title: "Go Back", style: .plain, target: self, action: #selector(backPressed))
vc?.navigationItem.backBarButtonItem = button
29
Erzékiel

La chose la plus simple à faire est de définir le titre dans le contrôleur parent (c’est-à-dire celui avec lequel vous souhaitez revenir). Si vous ne souhaitez pas que ce titre soit identique au titre affiché dans la vue de ce VC, vous pouvez modifier le titre dans viewWillDisappear en ce que vous voulez sur le bouton Précédent du prochain VC, puis le remettre dans ce que vous voulez parent dans viewWillAppear.

Si vous utilisez des storyboards, vous pouvez également définir le titre du titre directement dans IB.

Enfin, pour créer un bouton de retour personnalisé, vous pouvez faire quelque chose comme:

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

... veillez simplement à le faire dans le contrôleur de présentation (ou parent), et non dans le contrôleur de vue chargé (le contrôleur présenté).

17
Bladebunny
UIButton * backButton = [UIButton buttonWithType:UIButtonTypeCustom];
[backButton addTarget:self action:@selector(popViewController) forControlEvents:UIControlEventTouchUpInside];
[backButton setFrame:FRAME_DEFINE
[backButton setContentHorizontalAlignment:UIControlContentHorizontalAlignmentLeft];
[backButton setExclusiveTouch:YES];
[backButton setImage:[UIImage imageNamed:BACK_BUTTON_DEFAULT_ICON] forState:UIControlStateNormal];
[backButton setTitle:@"BACK" forState:UIControlStateNormal];
[backButton setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
UIBarButtonItem *backMenuBarButton = [[UIBarButtonItem alloc] initWithCustomView:backButton];
self.navigationItem.leftBarButtonItem = backMenuBarButton;
3
Durican Radu

eh bien, vous devez aller avec une image de fond et avec le titre et 

// Creates a back button instead of default behaviour (displaying title of previous screen)
UIBarButtonItem *backButton = [[UIBarButtonItem alloc] initWithImage:[UIImage imageNamed:@"back_arrow.png"]
                                                               style:UIBarButtonItemStyleBordered
                                                              target:self
                                                              action:@selector(backAction)];

tipsDetailViewController.navigationItem.leftBarButtonItem = backButton;
[backButton release];
0
Retro

Pour Swift, utilisez la réponse d'Erzekiel comme base pour cela, vous pouvez la simplifier pour -

extension UIViewController {

    func setBackButtonTitle(to title: String) {
        let barButtonItem = UIBarButtonItem(title: title, style: .plain, target: self, action: nil)
        self.navigationItem.backBarButtonItem = barButtonItem
    }
}

Cela doit être appelé depuis le viewController parent, par exemple dans viewWillDisappear -

override func viewWillDisappear(_ animated: Bool) {
    super.viewWillDisappear(animated)
    self.setBackButtonTitle(to: "Back"))
}
0
SomaMan

J'utilise un code comme:

UIBarButtonItem *leftBar = [[UIBarButtonItem alloc] init];
leftBar.title = @"Back";//Details
self.navigationController.navigationBar.topItem.backBarButtonItem = leftBar;
0
Mannam Brahmam