Você precisa usar protocolos delegados ... Veja como fazer isso:
Declare um protocolo no arquivo de cabeçalho do secondViewController. Deve ser assim:
#import <UIKit/UIKit.h>
@protocol SecondDelegate <NSObject>
-(void)secondViewControllerDismissed:(NSString *)stringForFirst
@end
@interface SecondViewController : UIViewController
{
id myDelegate;
}
@property (nonatomic, assign) id<SecondDelegate> myDelegate;
Não se esqueça de sintetizar o myDelegate em seu arquivo de implementação (SecondViewController.m):
@synthesize myDelegate;
No arquivo de cabeçalho do seu FirstViewController, inscreva-se no protocolo SecondDelegate fazendo o seguinte:
#import "SecondViewController.h"
@interface FirstViewController:UIViewController <SecondDelegate>
Agora, ao instanciar SecondViewController em FirstViewController, você deve fazer o seguinte:
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];
Por último, no arquivo de implementação do seu primeiro controlador de visualização (FirstViewController.m), implemente o método SecondDelegate para secondViewControllerDismissed:
- (void)secondViewControllerDismissed:(NSString *)stringForFirst
{
NSString *thisIsTheDesiredString = stringForFirst;
}
Agora, quando você está prestes a dispensar o segundo controlador de visualização, deseja invocar o método implementado no primeiro controlador de visualização. Esta parte é simples. Tudo o que você faz é, em seu segundo controlador de visualização, adicionar algum código antes de dispensar o código:
if([self.myDelegate respondsToSelector:@selector(secondViewControllerDismissed:)])
{
[self.myDelegate secondViewControllerDismissed:@"THIS IS THE STRING TO SEND!!!"];
}
[self dismissModalViewControllerAnimated:YES];
Os protocolos de delegação são EXTREMAMENTE, EXTREMAMENTE, EXTREMAMENTE úteis. Seria bom se familiarizar com eles :)
NSNotifications são outra maneira de fazer isso, mas como prática recomendada, prefiro usá-lo quando quero me comunicar entre vários viewControllers ou objetos. Aqui está uma resposta que postei anteriormente se você estiver curioso sobre como usar NSNotifications: Eventos de disparo em vários controladores de visualização de um thread no appdelegate
EDITAR:
Se você quiser passar vários argumentos, o código antes de dispensar terá a seguinte aparência:
if([self.myDelegate respondsToSelector:@selector(secondViewControllerDismissed:argument2:argument3:)])
{
[self.myDelegate secondViewControllerDismissed:@"THIS IS THE STRING TO SEND!!!" argument2:someObject argument3:anotherObject];
}
[self dismissModalViewControllerAnimated:YES];
Isso significa que a implementação do método SecondDelegate dentro do firstViewController será semelhante a:
- (void) secondViewControllerDismissed:(NSString*)stringForFirst argument2:(NSObject*)inObject1 argument3:(NSObject*)inObject2
{
NSString thisIsTheDesiredString = stringForFirst;
NSObject desiredObject1 = inObject1;
}