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;
}
Podría estar fuera de lugar aquí, pero estoy empezando a preferir la sintaxis de bloque al enfoque muy detallado de delegado / protocolo. Si crea vc2 desde vc1, tenga una propiedad en vc2 que pueda establecer desde vc1 que es un bloque
@property (nonatomic, copy) void (^somethingHappenedInVC2)(NSString *response);
Luego, cuando ocurra algo en vc2 de lo que quiera informar a vc1, ¡simplemente ejecute el bloque que definió en vc1!
self.somethingHappenedInVC2(@"Hello!");
Esto le permite enviar datos desde vc2 a vc1. Como magia. En mi opinión, esto es mucho más fácil / más limpio que los protocolos. Los bloques son increíbles y deben aceptarse tanto como sea posible.
EDITAR - Ejemplo mejorado
Digamos que tenemos un mainVC que queremos presentar un modalVC además de temporalmente para obtener alguna entrada de un usuario. Para presentar ese modalVC desde mainVC, necesitamos alloc / init dentro de mainVC. Cosas bastante básicas. Bueno, cuando creamos este objeto modalVC, también podemos establecer una propiedad de bloque que nos permita comunicarnos fácilmente entre ambos objetos vc. Así que tomemos el ejemplo anterior y coloquemos la siguiente propiedad en el archivo .h de modalVC:
@property (nonatomic, copy) void (^somethingHappenedInModalVC)(NSString *response);
Luego, en nuestro mainVC, después de haber asignado / iniciado un nuevo objeto modalVC, establece la propiedad de bloque de modalVC de esta manera:
ModalVC *modalVC = [[ModalVC alloc] init]; modalVC.somethingHappenedInModalVC = ^(NSString *response) { NSLog(@"Something was selected in the modalVC, and this is what it was:%@", response); }
Así que solo estamos configurando la propiedad del bloque y definiendo lo que sucede cuando se ejecuta ese bloque.
Finalmente, en nuestro modalVC, podríamos tener un tableViewController respaldado por una matriz de cadenas de datos. Una vez que se realiza una selección de fila, podríamos hacer algo como esto:
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { NSString *selectedString = self.dataSource[indexPath.row]; self.somethingHappenedInModalVC(selectedString); }
Y, por supuesto, cada vez que seleccionamos una fila en modalVC, obtendremos una salida de consola de nuestra línea NSLog en mainVC. ¡Espero que ayude!
fuente
mmm, busque el centro de notificaciones y envíe información en una notificación. Aquí las manzanas lo aceptan : tomo este enfoque personalmente a menos que alguien tenga alguna otra sugerencia
fuente
Defina un protocolo de delegado en el segundo controlador de vista y haga que el primero sea el delegado del segundo.
fuente