4 votes

iOS - Comment faire en sorte qu'un backBarButtonItem exécute également une fonction personnalisée ?

Je suis un débutant en développement iOS. J'utilise le code suivant pour définir mon backBarButtonItem -.

UIBarButtonItem *temporaryBarButtonItem=[[UIBarButtonItem alloc] init];
temporaryBarButtonItem.title=@"Back";
self.navigationItem.backBarButtonItem = temporaryBarButtonItem;
[temporaryBarButtonItem release];

Je veux aussi qu'il exécute une autre fonction, en plus du retour en arrière. Est-ce possible ? Ou bien ai-je besoin d'un autre bouton pour sauvegarder ?

7voto

JoePasq Points 3364

Vous pouvez pratiquement le faire dans votre viewDidDisappear o viewWillDisappear méthode.

Si cette vue ne peut que revenir en arrière et ne présente aucune vue, alors cela devrait fonctionner.

Toutefois, si vous prévoyez de présenter une sous-vue, une vue modale, d'aller plus loin dans la hiérarchie de navigation ou d'effectuer d'autres opérations de visualisation qui entraîneront l'utilisation de la commande viewDidDisapper pour être appelé, alors vous devrez séparer la logique du code du bouton arrière d'une manière ou d'une autre.

Par exemple, si vous présentez une vue modale à partir de cette vue, vous pouvez vérifier si self.modalViewController est nul, si c'est le cas, aucune vue modale n'est présente et vous pouvez exécuter le code du bouton retour en toute sécurité. Si elle n'est pas nulle, alors une vue modale est présente et vous ne devez pas exécuter le code du bouton retour. ( viewWillDisappear doit enregistrer le contrôleur de vue modal comme étant not-nil).

3voto

logancautrell Points 7508

Très simple, essayez ceci !

    [[UIBarButtonItem alloc] initWithTitle:@"Done" style:UIBarButtonItemStyleDone target:self action:@selector(myCoolAction:)];

Ensuite, il suffit de changer myCoolAction : en une méthode appropriée dans votre contrôleur de vue et de la gérer. Profitez-en !

EDIT : Oh, si vous voulez utiliser ceci pour le backBarButtonItem, cela ne fonctionnera pas comme vous le souhaitez. Le système n'appellera pas vos cibles/actions pour le backBarButtonItem. Elles sont effacées une fois assignées au backBarButtonItem.

Une façon de gérer cela est de connecter votre UINavigationController comme un délégué. Ensuite, dans votre

- (void)navigationController:(UINavigationController *)navigationController didShowViewController:(UIViewController *)viewController animated:(BOOL)animated

La méthode permet d'obtenir un comportement personnalisé.

2voto

Max MacLeod Points 8425

Strictement parlant, cela ne peut pas être fait avec UIKit.

Voir les documents sur backBarButtonItem :

La cible et l'action de l'élément du bouton de la barre arrière que vous avez défini doivent être les suivantes nulles. La valeur par défaut est un élément de bouton de barre affichant la navigation de l'élément de navigation.

La solution consiste à spécifier un leftBarButtonItem et attachez tout comportement personnalisé dont vous avez besoin en attachant un fichier @selector cible.

La partie la plus délicate est l'image du bouton elle-même. Comme vous le savez, le bouton par défaut n'est pas rectangulaire. Il a plutôt la forme d'une flèche sur le côté gauche. Pour cela, vous devrez définir une image personnalisée pour que le bouton ait l'apparence du bouton par défaut.

Il existe des tonnes de ressources pour le faire, dont celle-ci, qui permet d'extraire toutes les illustrations UIKit :

https://github.com/0xced/UIKit-Artwork-Extractor

1voto

nanjunda Points 604

Vous pouvez ajouter UIBarButtonItem dans le xib et y ajouter le gestionnaire d'événements.

Sinon, créez UIBarButtonItem avec une vue personnalisée, qui est un UIButton, et ajoutez le gestionnaire d'événements.

1voto

Chris Savory Points 411

Vous devriez pouvoir faire quelque chose comme ça au lieu d'utiliser viewDidDisappear o viewWillDisappear .

Placez ceci dans viewDidLoad :

self.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"Cancel" style:UIBarButtonItemStyleDone target:self action:@selector(cancelButtonAction:)];
self.navigationItem.leftItemsSupplementBackButton = NO;

Ensuite, vous pouvez créer la méthode cancelButtonAction cancelButtonAction pour votre code personnalisé et la fonctionnalité de retour comme ceci :

- (void)cancelButtonAction:(id)sender {
    //Your custom code goes here...

    //This will perform the back functionality if using a Navigation Controller
    [self.navigationController popViewControllerAnimated:YES];
}

Remarque : cela se traduira par un bouton rectangulaire, sans la flèche.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X