2010-08-23 4 views
0

J'ai une variable, editForm, qui est utilisée comme un pointeur vers un contrôleur de vue. Plus tard, j'utilise une méthode déléguée pour publier editForm lorsque l'utilisateur appuie sur le bouton pour fermer la vue. Le problème est que la vue doit souvent être recréée avec une nouvelle ardoise. Y at-il un moyen de libérer le contrôleur tout en gardant le pointeur vide prêt pour les instanciations futures? Ou un moyen de redéclarer le "EditFormViewController * editForm;" déclaration à l'intérieur d'une méthode?Libérer le contrôleur, mais garder le pointeur vide?

Edition, voici la méthode de la openeditform:

- (void)openeditform:(NSString*)editId { 
    EditFormViewController* editFormController = [[EditFormViewController alloc] initWithNibName:@"EditFormView" bundle:nil editId:editId]; 
    [editFormController.view setFrame:CGRectMake(0, 0, 640, 460)]; 
    [self.view addSubview:editFormController.view]; 
    editFormController.delegate = self; 
    [UIView beginAnimations:@"editform view open" context:nil]; 
    [UIView setAnimationDuration:0.5]; 
    [UIView setAnimationCurve:UIViewAnimationCurveEaseOut]; 
    [UIView setAnimationTransition:UIViewAnimationTransitionCurlDown forView:self.view.superview cache:YES]; 
    [editFormController.view setFrame:CGRectMake(0, 0, 320, 460)]; 
    [UIView commitAnimations]; 
    self.editForm = editFormController; 
    [editFormController release]; 
} 

Pour Jerry Jones, voici les bits pertinents pour la suppression de la vue.

EditFormViewController.m:

- (void) closeEditForm { 
    [UIView beginAnimations:@"editform view close" context:nil]; 
    [UIView setAnimationDuration:0.5]; 
    [UIView setAnimationCurve:UIViewAnimationCurveEaseOut]; 
    [UIView setAnimationTransition:UIViewAnimationTransitionCurlUp forView:self.view.superview cache:YES]; 
    //[UIView setAnimationDelegate:self]; 
    [self.view removeFromSuperview]; 
    AppDelegate *appDelegate = [[UIApplication sharedApplication] delegate]; 
    [appDelegate reloadEditViewTable]; 
    [UIView commitAnimations]; 
    [delegate didDismissEditFormView]; 
} 

Et la méthode déléguée, qui est actuellement pas utilisé pour quoi que ce soit, puisque je mis en œuvre la suggestion de Estarriol, ce qui ne fait pas pleinement ce que je veux encore faire:

- (void)didDismissEditFormView { 
    NSLog(@"Fired delegate."); 
    //[editForm release]; 
} 

Répondre

4

Je crois que votre EditFormViewController ne devrait pas être une variable, mais une variable d'instance de votre EditViewController:

.h:

@class EditFormViewController; 
@interface EditViewController 
{ 
.... 
EditFormViewController* editform; 
... 
} 

... 
@property (nonatomic, retain) EditFormViewController* editForm; 
... 

Dans votre fichier m:

@implementation EditViewController 
... 
-(void)openeditform:(NSString*)editId { 
    EditFormViewController* editFormController = [[EditFormViewController alloc] initWithNibName:@"EditFormView" bundle:nil editId:editId]; 
self.editForm = editFormController; 
[editFormController release]; 
... 

De cette façon, il serait recréée chaque openeditform temps est tiré, et l'ancienne instance correctement libéré.

+0

Ne fonctionne pas. Il finit par charger à nouveau la même instance de vue, avec les mêmes valeurs que celle fermée. (Ou je peux libérer self.editForm et puis je ne peux pas réinstancier la vue.) –

+0

J'ai édité ma question pour montrer la méthode openeditform complète maintenant que j'ai fait les changements. –

+0

En outre, il semble se briser après l'ouverture et la fermeture de la vue trois fois, ce qui semble indiquer une fuite de mémoire ... –

1

C'est un peu difficile à comprendre. Vous créez un contrôleur de vue et affichez sa vue. Ensuite, lorsque vous "rejetez" le contrôleur de vue, vous supprimez sa vue? Présentez-vous parfois un nouveau contrôleur "vide" et affichez parfois le même contrôleur "rempli"?

Vous nous montrent la méthode de création, mais ce qui se passe quand il est rejeté? Quand vous dites re-instancier, voulez-vous vraiment dire cela, ou voulez-vous simplement le montrer à nouveau?

+0

Je supprime la vue. Je veux que le contrôleur soit libéré et réinitialisé à son état "d'usine" de sorte que tout soit de retour à la valeur par défaut la prochaine fois que la vue est créée. –

+0

Veuillez ajouter le code que vous exécutez après la suppression de la vue. –

Questions connexes