2009-02-04 6 views
2

Plus précisément, que suis-je censé faire avec la vue qui est maintenant cachée après avoir poussé sur un nouveau contrôleur de vue?
Dans ma situation, j'ai une vue avec des animations en cours, qui continuent à s'exécuter après que la vue soit hors écran.Qu'arrive-t-il à la vue racine dans UINavigationViewController lorsque vous appuyez sur une nouvelle vue?

Y a-t-il une convention acceptée? Est-ce que je supprime le View Controller et View de la mémoire?
Est-ce que Cocoa Touch a une méthode pratique pour "mettre en veille" une vue (et un contrôleur) et la retirer de la mémoire, et la faire revenir en cas de besoin (après un bruit)? Dois-je l'archiver moi-même et ensuite le désarchiver?

Y a-t-il des exemples auxquels vous pouvez m'indiquer?

Merci

Répondre

2

Dans des conditions de faible mémoire, la propriété « vue » de votre contrôleur sera automatiquement mis à zéro, si ce n'est pas à l'écran. Ensuite, la vue se rechargera automatiquement quand elle sera nécessaire - et viewDidLoad devrait être appelée à ce moment-là. Si votre contrôleur de vue conserve des sous-vues de la vue de niveau supérieur, vous pouvez remplacer la méthode setView: du contrôleur de vue, vérifier si la vue est définie sur zéro et, le cas échéant, libérer les sous-vues que vous conservaient. Sinon, la vue de niveau supérieur peut ne jamais être désallouée.

- (void)setView:(UIView *)view 
{ 
    [super setView:view]; 
    if (view == nil) 
    { 
     // Release other views 
     // self.someView = nil; 
    } 
} 
+0

viewDidLoad ne sera appelé qu'une seule fois. La vue est définie sur zéro uniquement lorsque la vue est affichée et non plus dans la liste des contrôleurs de vue du contrôleur de navigation. – lostInTransit

+1

Vous ne devez pas remplacer la méthode -setView. Vous recevez la méthode de rappel -viewDidUnload pour effectuer la tâche que vous avez mentionnée. La propriété view de viewController est définie sur zéro uniquement dans des conditions de mémoire insuffisante, qui, si elles ne se sont pas produites, la même vue est présentée à l'utilisateur après l'opération pop. Je ne suis pas sûr si les animations sont manipulées intelligemment par le système depuis la vue de rootViewController dans la hiérarchie de vue de fenêtre quand un nouveau viewController est poussé. –

3

Une autre solution possible consiste à mettre en œuvre deux des méthodes suivantes:

– viewWillAppear: 
– viewDidAppear: 
– viewWillDisappear: 
– viewDidDisappear: 

Vous pourriez potentiellement arrêter l'animation dans viewWillDisappear ou viewDidDisappear puis redémarrez dans viewWillAppear ou viewDidAppear. Vous pouvez également stocker toutes les informations d'état nécessaires sur l'animation avant de l'arrêter.

1

Chaque fois que vous appelez pushViewController, le viewcontroller actuel est stocké dans un tableau par le contrôleur de navigation (accessible à l'aide de la propriété viewControllers de navcontroller).

Pensez-y comme une pile. Comme vous appelez pushViewController, un nouveau viewcontroller est ajouté à la pile au-dessus du viewcontroller actuel. Mais votre rootviewcontroller est toujours en mémoire. Lorsque vous appelez popViewController, ce viewcontroller est retiré de la pile et libéré. Par conséquent, si vous voulez arrêter votre animation lorsque la vue disparaît, utilisez la méthode viewWillDisappear comme suggéré par Andy.

Questions connexes