È necessario utilizzare i protocolli delegato ... Ecco come farlo:
Dichiara un protocollo nel file di intestazione del tuo secondViewController. Dovrebbe sembrare come questo:
#import <UIKit/UIKit.h>
@protocol SecondDelegate <NSObject>
-(void)secondViewControllerDismissed:(NSString *)stringForFirst
@end
@interface SecondViewController : UIViewController
{
id myDelegate;
}
@property (nonatomic, assign) id<SecondDelegate> myDelegate;
Non dimenticare di sintetizzare il myDelegate nel file di implementazione (SecondViewController.m):
@synthesize myDelegate;
Nel file di intestazione di FirstViewController iscriviti al protocollo SecondDelegate in questo modo:
#import "SecondViewController.h"
@interface FirstViewController:UIViewController <SecondDelegate>
Ora, quando installi SecondViewController in FirstViewController, dovresti fare quanto segue:
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];
Infine, nel file di implementazione per il tuo primo controller di visualizzazione (FirstViewController.m) implementa il metodo SecondDelegate per secondViewControllerDismissed:
- (void)secondViewControllerDismissed:(NSString *)stringForFirst
{
NSString *thisIsTheDesiredString = stringForFirst;
}
Ora, quando stai per chiudere il secondo controller di visualizzazione, vuoi richiamare il metodo implementato nel primo controller di visualizzazione. Questa parte è semplice. Tutto quello che fai è, nel tuo secondo controller di visualizzazione, aggiungere del codice prima del codice di eliminazione:
if([self.myDelegate respondsToSelector:@selector(secondViewControllerDismissed:)])
{
[self.myDelegate secondViewControllerDismissed:@"THIS IS THE STRING TO SEND!!!"];
}
[self dismissModalViewControllerAnimated:YES];
I protocolli delegati sono ESTREMAMENTE, ESTREMAMENTE, ESTREMAMENTE utili. Ti farebbe bene familiarizzare con loro :)
NSNotifications è un altro modo per farlo, ma come best practice, preferisco usarlo quando voglio comunicare tra più viewController o oggetti. Ecco una risposta che ho pubblicato in precedenza se sei curioso di utilizzare NSNotifications: Attivazione di eventi su più viewcontroller da un thread nell'appdelegate
MODIFICARE:
Se vuoi passare più argomenti, il codice prima di ignorare ha questo aspetto:
if([self.myDelegate respondsToSelector:@selector(secondViewControllerDismissed:argument2:argument3:)])
{
[self.myDelegate secondViewControllerDismissed:@"THIS IS THE STRING TO SEND!!!" argument2:someObject argument3:anotherObject];
}
[self dismissModalViewControllerAnimated:YES];
Ciò significa che l'implementazione del metodo SecondDelegate all'interno del firstViewController ora sarà simile a:
- (void) secondViewControllerDismissed:(NSString*)stringForFirst argument2:(NSObject*)inObject1 argument3:(NSObject*)inObject2
{
NSString thisIsTheDesiredString = stringForFirst;
NSObject desiredObject1 = inObject1;
}