Vous devez utiliser des protocoles de délégation ... Voici comment procéder:
Déclarez un protocole dans le fichier d'en-tête de votre secondViewController. Ça devrait ressembler à ça:
#import <UIKit/UIKit.h>
@protocol SecondDelegate <NSObject>
-(void)secondViewControllerDismissed:(NSString *)stringForFirst
@end
@interface SecondViewController : UIViewController
{
id myDelegate;
}
@property (nonatomic, assign) id<SecondDelegate> myDelegate;
N'oubliez pas de synthétiser le myDelegate dans votre fichier d'implémentation (SecondViewController.m):
@synthesize myDelegate;
Dans le fichier d'en-tête de votre FirstViewController, abonnez-vous au protocole SecondDelegate en procédant comme suit:
#import "SecondViewController.h"
@interface FirstViewController:UIViewController <SecondDelegate>
Maintenant, lorsque vous instanciez SecondViewController dans FirstViewController, vous devez effectuer les opérations suivantes:
SecondViewController *second = [[SecondViewController alloc] initWithNibName:"SecondViewController" bundle:[NSBundle mainBundle]];
SecondViewController *second = [SecondViewController new];
second.myString = @"This text is passed from firstViewController!";
second.myDelegate = self;
second.modalTransitionStyle = UIModalTransitionStyleCrossDissolve;
[self presentModalViewController:second animated:YES];
[second release];
Enfin, dans le fichier d'implémentation de votre premier contrôleur de vue (FirstViewController.m), implémentez la méthode de SecondDelegate pour secondViewControllerDismissed:
- (void)secondViewControllerDismissed:(NSString *)stringForFirst
{
NSString *thisIsTheDesiredString = stringForFirst;
}
Maintenant, lorsque vous êtes sur le point de fermer le deuxième contrôleur de vue, vous souhaitez appeler la méthode implémentée dans le premier contrôleur de vue. Cette partie est simple. Tout ce que vous faites est, dans votre deuxième contrôleur de vue, d'ajouter du code avant le code de rejet:
if([self.myDelegate respondsToSelector:@selector(secondViewControllerDismissed:)])
{
[self.myDelegate secondViewControllerDismissed:@"THIS IS THE STRING TO SEND!!!"];
}
[self dismissModalViewControllerAnimated:YES];
Les protocoles délégués sont EXTRÊMEMENT, EXTRÊMEMENT, EXTRÊMEMENT utiles. Cela vous ferait du bien de vous familiariser avec eux :)
NSNotifications est une autre façon de faire cela, mais comme meilleure pratique, je préfère l'utiliser lorsque je souhaite communiquer sur plusieurs viewControllers ou objets. Voici une réponse que j'ai publiée plus tôt si vous êtes curieux d'utiliser NSNotifications: déclencher des événements sur plusieurs contrôleurs de vue à partir d'un fil de discussion dans l'appdelegate
ÉDITER:
Si vous souhaitez passer plusieurs arguments, le code avant de rejeter ressemble à ceci:
if([self.myDelegate respondsToSelector:@selector(secondViewControllerDismissed:argument2:argument3:)])
{
[self.myDelegate secondViewControllerDismissed:@"THIS IS THE STRING TO SEND!!!" argument2:someObject argument3:anotherObject];
}
[self dismissModalViewControllerAnimated:YES];
Cela signifie que votre implémentation de méthode SecondDelegate dans votre firstViewController ressemblera maintenant à:
- (void) secondViewControllerDismissed:(NSString*)stringForFirst argument2:(NSObject*)inObject1 argument3:(NSObject*)inObject2
{
NSString thisIsTheDesiredString = stringForFirst;
NSObject desiredObject1 = inObject1;
}