2010-06-17 4 views
0

J'ai l'impression qu'il me manque quelque chose de basique ici, et j'apprécierais que vous m'aidiez à tout rassembler. Disons que j'ai deux contrôleurs de vue ... ViewAController et ViewBController.XCode: insertSubview, removeFromSuperview, viewDidLoad ... Tirer tous ensemble

Si je voulais montrer viewA, je ferais ceci:

ViewAController *new_view = [[ViewAController alloc] initWithNibName:@"ViewAController" bundle:nil]; 
self.viewAController = new_view; 
[self.view insertSubView:new_view.view atIndex:0]; 
[new_view release]; 

Si, après avoir montré viewA, je voulais montrer contrôleur viewB, je ferais ceci:

[self.viewAController.view removeFromSuperview]; 
    ViewBController *new_view = [[ViewBController alloc] initWithNibName:@"ViewBController" bundle:nil]; 
    self.viewBController = new_view; 
    [self.view insertSubView:new_view.view atIndex:0]; 
[new_view release]; 

Voici ma question ...

Quand je charge la vue viewA pour la première fois, la fonction "viewDidLoad" de viewA tire ... Elle est évidemment chargée pour la première fois. Cependant, lorsque je retire viewA du superview, charge dans viewB, puis plus tard de la charge viewA à nouveau comme ceci:

[self.viewBController.view removeFromSuperview]; 
if (self.viewAController == nil) { 

    ViewAController *new_view = [[ViewAController alloc] initWithNibName:@"ViewAController" bundle:nil]; 
    self.viewAController = new_view; 
    [self.view insertSubview:new_view.view atIndex:0]; 
    [new_view release]; 

} else { 

    [self.view insertSubview:self.viewAController.view atIndex:0]; 

} 

fonction « viewDidLoad » de viewA ne se déclenche pas au large. C'est comme si viewA a été retiré de la vue, mais son état est en quelque sorte sauvegardé en mémoire. Lorsque je charge à nouveau viewA, je sais que cela vient en quelque sorte de l'endroit où il s'est arrêté. Ce que j'ai vraiment besoin de faire, c'est de charger comme si c'était la première fois de chargement, avec "viewDidLoad", etc ...

J'espère avoir bien expliqué cela. Si quelqu'un pouvait apporter des éclaircissements, je l'apprécierais.

Répondre

2

Si vous ne définissez pas self.viewAController à zéro, alors il ne s'en tirera pas. Vous l'avez probablement (heureusement) conservé avec votre propriété self.viewAController.

Vous pourriez le libérer après le chargement de la vue B (si vous n'en avez pas besoin ailleurs).

Si vous déboguez votre code if/else, vous verrez probablement que le bloc "if" n'est jamais visité.

+0

J'ai eu cette même idée au début. J'ai essayé ceci: self.viewAController = nil; Mais l'application s'est écrasée. J'ai finalement découvert que vous devez faire ceci: self.viewAController.view = nil; – tambler