2010-07-19 6 views
0

je une application qui passe autour d'environ 10 différents contrôleurs de vue avec des méthodes comme celle-ci:obj-c presentmodalviewcontroller .. Où libérer

-(IBAction)pg2button{ 
     pg2 *pg2view = [[pg2 alloc] initWithNibName: nil bundle: nil]; 
     pg2view.modalTransitionStyle = UIModalTransitionStyleCrossDissolve; 
     [self presentModalViewController:pg2view animated:YES]; 
     [pg2view release]; 
    } 

Où est un bon endroit pour libérer la vue en cours avant la prochaine on est présenté? Merci!

+0

Voulez-vous dire libération ou rejet? – vodkhang

+0

Je veux dire rejeter. Quand je présente une nouvelle vue modale à partir de celle-ci, j'ai besoin de rejeter l'ancienne ou bien elle monopolise la mémoire. – Hippocrates

Répondre

2

(1) Formulez votre question: ajoutez au moins 4 espaces avant chaque ligne de code.

(2) Pourquoi utilisez-vous l'initialiseur initWithNibName:bundle: si vous transmettez le nom NIB? Il suffit d'utiliser le init régulier.

(3) Je vois que vous avez déjà libéré le contrôleur de vue.
Il sera publié une fois de plus (en arrière-plan) une fois que vous le rejetter.

(4) Si vous avez l'intention de demander "Où est un bon endroit pour ignorer la vue actuelle avant la prochaine est présentée?" alors cela dépend de votre structure.
Habituellement, la meilleure approche consiste à ajouter une méthode de délégué dans le contrôleur de vue d'origine, le contrôleur de vue modale appellera cette méthode délégué et le contrôleur de vue d'origine rejettera le modal comme ceci: [self dismissModalViewControllerAnimated:YES];.

EDIT:
Exemple de code pour le délégué:

// The protocol that your original view controller should implement 
@protocol ModalViewControllerDelegate <NSObject> 

@required 
- (void)modalViewControllerDidCancel:(UIViewController *)modalViewController; 
- (void)modalViewController:(UIViewController *)modalViewController didReturnWithResult:(NSObject)result; 

@end 

Voici comment mettre en œuvre:

@interface MainViewController : UIViewController <ModalViewControllerDelegate> { 

    ... 

} 

... 

@end 

@implementation MainViewController 

... 

#pragma mark - 
#pragma mark ModalViewControllerDelegate methods 

- (void)modalViewControllerDidCancel:(UIViewController *)modalViewController { 
    [self dismissModalViewControllerAnimated:YES]; 
} 

- (void)modalViewController:(UIViewController *)modalViewController didReturnWithResult:(NSObject)result { 
    // TODO: Do something with the result 

    [self dismissModalViewControllerAnimated:YES]; 
} 

... 

@end 

vous devez ajouter le code à côté de vos contrôleurs modales vue:

@interface ModalViewController1 : UIViewController { 

    ... 

    id<ModalViewControllerDelegate> delegate; 

    ... 

} 

@property (assign) id<ModalViewControllerDelegate> delegate; 

... 

@end 


@implementation ModalViewController1 

@synthesize delegate; 

... 

- (void)cancelUserAction { 

    ... 

    [self.delegate modalViewControllerDidCancel:self]; 
} 

@end 



N'oubliez pas également de définir la propriété delegate sur self (à partir de MainViewController) une fois que vous avez créé le contrôleur de vue modale ...

+0

Merci. Il semble que je doive suivre la voie des délégués, mais j'ai du mal à comprendre comment l'appliquer, car il y a tellement d'exemples et ils semblent tous différents. Évidemment, je suis assez nouveau à Obj-c. Toutes mes vues sont présentées (à l'exception de la première) avec la méthode presentmodalview, et elles ont chacune à peu près le même menu de boutons qui présente d'autres vues de manière modale, et vous pouvez simplement passer d'une vue à l'autre. Je me suis probablement trompé en ce que je l'ai programmé exactement comment il apparaît visuellement. je pense que j'aurais pu utiliser 1 ou 2 contrôleurs de vue au lieu de 9. – Hippocrates

+0

Voir l'exemple de code que j'ai ajouté à ma réponse ... –