web-dev-qa-db-fra.com

Détendez-vous enchaînez avec le bouton de navigation arrière

J'ai regardé la vidéo de démonstration de Apple sur la mise en œuvre du storyboard avec la section des séquences de déroulement et j'ai vu la démonstration en utilisant des boutons personnalisés sur la vue principale. Cela fonctionne très bien.

J'ai également vu un bon exemple de la même chose ici qui fonctionne également. http://www.techotopia.com/index.php/Using_Xcode_Storyboarding_%28iOS_6%29#Unwinding_Storyboard_Segues

Cependant, je souhaite avoir une séquence Push normale passant du parent (avec les données du formulaire principal) à l'enfant (avec les options de paramètres avancés), puis revenir au contrôleur de vue parent en utilisant le bouton de retour dans la barre de navigation plutôt qu'avec un bouton personnalisé sur la vue comme indiqué dans la démo. Le contrôleur parent enregistre ensuite tout sur un serveur API lorsqu'un autre bouton d'enregistrement du contrôleur parent est enfoncé.

Je ne semble pas être en mesure de remplacer le bouton de navigation arrière pour le pointer vers mon action de déroulement de déroulement et puisque le bouton de retour n'apparaît pas sur le storyboard, je ne peux pas y faire glisser le bouton vert de sortie

J'ai essayé ceci dans viewDidLoad pour remplacer l'action, mais cela n'a pas fonctionné [self.navigationItem.backBarButtonItem setAction: @selector (unwindSegueAction :)];

Est-il possible de dérouler une séquence Push avec le bouton de retour?

La meilleure idée que j'ai eue jusqu'à présent était de remplacer le bouton arrière de la méthode viewDidLoad, mais cela supprime le style du bouton arrière incliné et semble également être un hack grossier pour un problème simple

self.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"back" style:UIBarButtonItemStyleBordered target:self action:@selector(unwindSegue:)];

Je sais qu'il existe des réponses pour l'utilisation du protocole et des délégués, mais je suis intéressé par l'utilisation de la méthode de segue de déroulement Xcode4.5

31
Alan

Au final, je n'avais pas besoin de dérouler la séquence, car je pouvais toujours obtenir une référence aux méthodes du contrôleur parent en suivant le contrôleur de navigation.

J'ai pu obtenir une référence en procédant comme suit dans la méthode - (void)viewWillDisappear:(BOOL)animated du contrôleur enfant

NSInteger currentVCIndex = [self.navigationController.viewControllers indexOfObject:self.navigationController.topViewController];

FirstViewController *parent = (FirstViewController *)[self.navigationController.viewControllers objectAtIndex:currentVCIndex];

parent.barcodeType = indexPath.row;

qui a transmis la variable des paramètres au contrôleur d'origine parfaitement.

J'ai également ajouté une référence d'importation au contrôleur parent en haut du childcontroller

14
Alan

@Alan est sur la bonne voie. Ajoutez simplement un test pour empêcher la séquence de se déclencher lorsque vous ne revenez pas au premier contrôleur de vue. Quelque chose comme ça dans viewWillDisappear vous permettra en fait d'effectuer la séquence de déroulement pour un bouton de retour. Vous devrez créer une séquence de déroulement manuel en faisant glisser la classe vers l'icône de sortie. Assurez-vous de le nommer après l'avoir créé.

UIViewController *vc = self.navigationController.topViewController;
if ([FirstViewController class] == [vc class])
{
    [self performSegueWithIdentifier:@"unwindSegue" sender:self];
}
6
Chuck H

Je voudrais ajouter une solution Swift qui suit la suggestion de @Chuck H ci-dessus:

let rootVC = self.navigationController!.topViewController
if rootVC.isKindOfClass(TheNameOfYourViewController) {
    performSegueWithIdentifier("yourNamedSegueIdentifier", sender: self)
}
5
Claudio Morsella

Une alternative que vous n'avez peut-être pas envisagée consiste à faire du parent un délégué de l'enfant et à utiliser des méthodes déléguées dans l'enfant pour mettre à jour le parent.

De cette façon, vous contournez la nécessité d'ajouter au déroulement de la navigation, car le parent est déjà à jour au moment où vous répondez.

1
catalandres