2014-04-23 1 views
1

J'ai un contrôleur de vue racine avec sous-vue à encapsuler pour les vues des contrôleurs de vue enfant. L'idée de base est que mon contrôleur racine possède un contrôleur de vue gauche et droit, tous deux présents sur l'écran (similaire à un contrôleur splitview). Au chargement, une vue modale apparaît sur le contrôleur de la vue racine et demande des détails. La vue modale contacte ensuite un serveur et est rejetée après avoir reçu une réponse. Le contrôleur racine ajoute les contrôleurs de vue de l'enfant avec le code suivant:Le conteneur du contrôleur de vue manque sporadiquement viewWillAppear dans les contrôleurs enfants

[self addViewController:self.leftViewController]; 
[self addViewController:self.rightViewController]; 

[self addView:self.rightViewController.view ToWrapper:self.rightViewWrapper]; 
[self addView:self.leftViewController.view ToWrapper:self.leftViewWrapper]; 

Où ajouter contrôleur de vue est:

[self addChildViewController:controller]; 
[controller didMoveToParentViewController:self]; 

et addViewToWrapper ajoute que le point de vue du contrôleur de vue de la sous-vue pertinente du RootViewController comme suit:

[[viewWrapper.contentView subviews] makeObjectsPerformSelector:@selector(removeFromSuperview)]; 
newSubview.frame = viewWrapper.contentView.bounds; 
newSubview.autoresizingMask = UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth; 
[viewWrapper.contentView addSubview:newSubview]; 

99% du temps cela fonctionne bien. Les deux vues apparaissent instantanément et viewWillAppear se déclenche dans les deux contrôleurs enfants. Cependant, parfois l'écran reste blanc pendant une courte période et viewWillAppear ne se déclenche pas dans le bon contrôleur de vue (EDIT: et la gauche). Toutes les autres méthodes d'affichage du cycle de vie sont activées, mais pas viewWillAppear.

Malheureusement, je ne peux pas donner de code pour toute la classe car elle est complexe et propriétaire. Mais y a-t-il des indices dans cette description pour ce comportement intermittent?

+0

Je devrais également ajouter que cela se passe bien après appDelegate a commencé l'application. Derrière la vue modale sont 2 espaces réservés vides. Lorsque la vue modale est ignorée, ces contrôleurs sont supprimés et les nouveaux contrôleurs enfants ajoutés. –

+0

Un indice assez important est que la suppression de l'écran modal, supprime le problème. Quelque chose lors du rejet de l'écran modal bloque la vue apparaîtra des contrôleurs de vue enfant. –

Répondre

2

Quelques réflexions sur ce point:

UN

Il ressemble à vos méthodes de confinement ne sont pas appelés correctement. Ils devraient ressembler à ceci pour chaque viewController:

[self addChildViewController:controller]; 
    [self.view addSubview:controller.view]; 
    [controller didMoveToParentViewController:self]; 

La vue doit être ajouté à la superview entre les appels addChild et didMove.

DEUX

A ma connaissance, il ne peut y avoir plus d'une présentation ou licenciement survenant à un moment. C'est à dire. Si vous essayez de présenter (ajouter) vos viewController enfants en même temps que le modal est en train d'être rejeté, vous verrez une erreur dans le journal de la console et votre opération "add" ne se produira pas.

Ma recommandation serait de créer un protocole délégué sur le contrôleur de vue modal. Et dans le bloc d'achèvement de dismissViewControllerAnimated:completion:, appelez votre méthode déléguée:

[self dismissViewControllerAnimated:YES completion:^{ 
    if ([weakSelf.delegate respondsToSelector:@selector(settingsViewControllerDidDismiss:)]) 
    { 
     [weakSelf.delegate settingsViewControllerDidDismiss:self]; 
    } 
}]; 

Et dans votre RootViewController, vous commenceriez ajouter ses enfants à l'intérieur de settingsViewControllerDidDismiss ou tout ce que vous décidez d'appeler cette méthode. Le fait est que l'opération "ajouter" commence APRÈS l'opération de renvoi.

Hope this helps.

+0

Ah, je n'ai pas réalisé que l'ordre d'ajouter la vue était important. Il semble que ce soit la vue modale qui cause le problème. De manière gênante, l'opération d'ajout est déclenchée par des événements totalement indépendants de l'opération de rejet. Je vais donc devoir la déclencher d'une manière ou d'une autre. –

+1

Sonne bien, si vous finissez par penser que c'est la bonne réponse, s'il vous plaît ne pas oublier de le marquer comme tel. Je suis à peu près certain que le problème que vous vivez est dû à une présentation/congédiement simultané. –

+0

C'est presque définitivement la réponse. J'ai ajouté une notification pour dire au modal de rejeter une fois que les contrôleurs de vue derrière lui sont complètement chargés (peut-être pas le bon chemin, mais le plus propre du point de vue de l'interface utilisateur). Je n'ai pas vu le problème depuis. –

Questions connexes