Comment appeler automatiquement une méthode après avoir sorti un contrôleur de vue de la pile sur l'iPhone

StackOverflow https://stackoverflow.com/questions/1001441

  •  05-07-2019
  •  | 
  •  

Question

Je dois mettre à jour la vue parent sur un iPhone après avoir supprimé une vue enfant de la pile de navigation. Comment puis-je configurer la vue parent pour recevoir une notification ou recevoir un appel de méthode automatique lorsque l'enfant est extrait de la pile et que le parent redevient visible?

L'utilisateur entre les données sur la page enfant que je souhaite afficher sur la page parent une fois que l'utilisateur a terminé et ouvre la vue.

Merci pour votre aide!

Était-ce utile?

La solution

Je viens de résoudre ce même problème - et les réponses ci-dessus sont presque correctes, ils ont tout simplement oublié de définir le délégué.

J'ai un contrôleur de vue racine qui affiche la taille d'une liste, appelle un contrôleur de vue enfant susceptible de modifier la taille d'une liste et doit mettre à jour la taille au retour.

Lorsque je crée ma vue parent (SettingsView ci-dessous) et que je l'ajoute à la vue racine d'un contrôleur UINavigationController, je m'assure de définir le délégué de UINavigationController avant d'afficher la vue - c'est l'élément clé:

SettingsView *sv = [[SettingsView alloc] initWithNibName:@"SettingsView" bundle:nil];
UINavigationController *nc = [[UINavigationController alloc] initWithRootViewController:sv];
[nc setDelegate:sv];

Dans la vue parent, implémentez le protocole UINavigationControllerDelegate:

@interface SettingsView : UIViewController <UINavigationControllerDelegate>

et fournissez la méthode willShowViewController:

- (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated
{
    // Your code to update the parent view
}

Ceci est appelé après le rejet de la vue enfant et avant l'affichage de la vue parent.

Autres conseils

J'ai eu le besoin de faire quelque chose comme ça aussi. Dans le ViewController appartenant à mon UINavigationController , je devais implémenter willShowViewController , comme suit:

- (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated {
}

Cette méthode est appelée à chaque fois que UINavigationController change de vue. Si je comprends bien votre question, je pense que cela devrait faire ce que vous voulez.

Je pense qu'il y a une certaine confusion ici. Les UIView ne sont pas poussés dans la pile de UINavigationController . UIViewControllers , qui gère à son tour une ou (plus souvent) plusieurs vues chacune.

Heureusement, UIViewController utilise les méthodes suivantes:

-(void) viewWillAppear:(BOOL)animated;
-(void) viewDidAppear:(BOOL)animated;
-(void) viewWillDisappear:(BOOL)animated;
-(void) viewDidDisappear:(BOOL)animated;

Celles-ci sont appelées chaque fois que la vue est sur le point de (dis) apparaître ou vient de (dis) apparaître. Je travaille avec des barres d'onglets, des vues modales et des contrôleurs de navigation. (Et c’est une bonne idée de les utiliser lorsque vous implémentez des contrôleurs personnalisés.)

Donc, dans votre cas, si je comprends bien, vous devez simplement remplacer la méthode viewWillAppear : ou viewDidAppear : sur ce que vous appelez la "page parente". (qui est probablement géré par un UIViewController ) et inséré dans un code pour mettre à jour l'apparence de la page afin de refléter les données que vous venez d'entrer.

(Si je me souviens bien, vous devez vous assurer que UINavigationController reçoit un message viewWill / DidAppear: lors de son premier affichage, afin que ces messages puissent être affichés plus tard. être envoyé à ses contrôleurs enfants. Si vous configurez cela avec un modèle ou dans IB, vous n’aurez probablement pas à vous en soucier.)

La réponse de Felixyz a fait le tour pour moi. L'appel de la vue apparaîtra, la méthode exécutera le code à chaque fois que la vue apparaît. Différent de view a été chargé, qui exécute son code uniquement lors du premier chargement de la vue. Ainsi, votre vue parent ne se mettrait pas à jour si une vue enfant modifiait les informations affichées dans le parent et était ensuite supprimée du sac. Mais si la vue des appels des parents apparaît, le code est exécuté à chaque fois que la vue s'affiche à nouveau.

Assurez-vous d’appeler la super méthode en même temps. Une implémentation correcte ressemblerait à ceci:

- (void)viewWillAppear:(BOOL)animated
{
   [super viewWillAppear:animated];
    NSLog(@"View Appearing");
}

Si vous devez notifier un contrôleur à un autre, vous pouvez utiliser le modèle de délégation décrit ci-après. ici (voir 2e réponse) .

Malheureusement, il n’existe pas de notification automatique (autant que je sache) pour la tâche exacte décrite. Pour répondre à vos besoins, vous pouvez envoyer un message de délégation (c'est-à-dire à votre contrôleur parent) dans la fonction viewWillDisappear de votre contrôleur enfant.

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