Necesita usar protocolos delegados ... A continuación, le indicamos cómo hacerlo:
Declare un protocolo en el archivo de encabezado de su secondViewController. Debe tener un aspecto como este:
#import <UIKit/UIKit.h>
@protocol SecondDelegate <NSObject>
-(void)secondViewControllerDismissed:(NSString *)stringForFirst
@end
@interface SecondViewController : UIViewController
{
id myDelegate;
}
@property (nonatomic, assign) id<SecondDelegate> myDelegate;
No olvide sintetizar myDelegate en su archivo de implementación (SecondViewController.m):
@synthesize myDelegate;
En el archivo de encabezado de su FirstViewController, suscríbase al protocolo SecondDelegate haciendo esto:
#import "SecondViewController.h"
@interface FirstViewController:UIViewController <SecondDelegate>
Ahora, cuando crea una instancia de SecondViewController en FirstViewController, debe hacer lo siguiente:
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, en el archivo de implementación para su primer controlador de vista (FirstViewController.m) implemente el método de SecondDelegate para secondViewControllerDismissed:
- (void)secondViewControllerDismissed:(NSString *)stringForFirst
{
NSString *thisIsTheDesiredString = stringForFirst;
}
Ahora, cuando esté a punto de descartar el segundo controlador de vista, desea invocar el método implementado en el primer controlador de vista. Esta parte es simple. Todo lo que hace es, en su segundo controlador de vista, agregar algo de código antes del código de descarte:
if([self.myDelegate respondsToSelector:@selector(secondViewControllerDismissed:)])
{
[self.myDelegate secondViewControllerDismissed:@"THIS IS THE STRING TO SEND!!!"];
}
[self dismissModalViewControllerAnimated:YES];
Los protocolos de delegado son EXTREMADAMENTE, EXTREMADAMENTE, EXTREMADAMENTE útiles. Te vendría bien familiarizarte con ellos :)
NSNotifications es otra forma de hacer esto, pero como mejor práctica, prefiero usarlo cuando quiero comunicarme a través de múltiples viewControllers u objetos. Aquí hay una respuesta que publiqué anteriormente si tiene curiosidad sobre el uso de NSNotifications: Activación de eventos a través de múltiples controladores de vista desde un hilo en la aplicación
EDITAR:
Si desea pasar varios argumentos, el código antes de descartar se ve así:
if([self.myDelegate respondsToSelector:@selector(secondViewControllerDismissed:argument2:argument3:)])
{
[self.myDelegate secondViewControllerDismissed:@"THIS IS THE STRING TO SEND!!!" argument2:someObject argument3:anotherObject];
}
[self dismissModalViewControllerAnimated:YES];
Esto significa que la implementación del método SecondDelegate dentro de su firstViewController ahora se verá así:
- (void) secondViewControllerDismissed:(NSString*)stringForFirst argument2:(NSObject*)inObject1 argument3:(NSObject*)inObject2
{
NSString thisIsTheDesiredString = stringForFirst;
NSObject desiredObject1 = inObject1;
}