Musisz użyć protokołów delegata ... Oto jak to zrobić:
Zadeklaruj protokół w pliku nagłówkowym secondViewControllera. To powinno wyglądać tak:
#import <UIKit/UIKit.h>
@protocol SecondDelegate <NSObject>
-(void)secondViewControllerDismissed:(NSString *)stringForFirst
@end
@interface SecondViewController : UIViewController
{
id myDelegate;
}
@property (nonatomic, assign) id<SecondDelegate> myDelegate;
Nie zapomnij zsyntetyzować myDelegate w pliku implementacji (SecondViewController.m):
@synthesize myDelegate;
W pliku nagłówkowym FirstViewController zasubskrybuj protokół SecondDelegate, wykonując następujące czynności:
#import "SecondViewController.h"
@interface FirstViewController:UIViewController <SecondDelegate>
Teraz podczas tworzenia instancji SecondViewController w FirstViewController należy wykonać następujące czynności:
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];
Na koniec w pliku implementacji dla pierwszego kontrolera widoku (FirstViewController.m) zaimplementuj metodę SecondDelegate dla secondViewControllerDismissed:
- (void)secondViewControllerDismissed:(NSString *)stringForFirst
{
NSString *thisIsTheDesiredString = stringForFirst;
}
Teraz, gdy zamierzasz odrzucić drugi kontroler widoku, chcesz wywołać metodę zaimplementowaną w pierwszym kontrolerze widoku. Ta część jest prosta. Wszystko, co musisz zrobić, to w drugim kontrolerze widoku dodać kod przed kodem odrzucenia:
if([self.myDelegate respondsToSelector:@selector(secondViewControllerDismissed:)])
{
[self.myDelegate secondViewControllerDismissed:@"THIS IS THE STRING TO SEND!!!"];
}
[self dismissModalViewControllerAnimated:YES];
Protokoły delegatów są NIEZWYKLE, NIEZWYKLE, BARDZO przydatne. Dobrze by było, gdybyś się z nimi zapoznał :)
NSNotifications to inny sposób, aby to zrobić, ale jako najlepsze rozwiązanie wolę go używać, gdy chcę komunikować się między wieloma kontrolerami widoku lub obiektami. Oto odpowiedź, którą opublikowałem wcześniej, jeśli jesteś ciekawy korzystania z NSNotifications: Uruchamianie zdarzeń na wielu kontrolerach widoku z wątku w appdelegate
EDYTOWAĆ:
Jeśli chcesz przekazać wiele argumentów, kod przed odrzuceniem wygląda następująco:
if([self.myDelegate respondsToSelector:@selector(secondViewControllerDismissed:argument2:argument3:)])
{
[self.myDelegate secondViewControllerDismissed:@"THIS IS THE STRING TO SEND!!!" argument2:someObject argument3:anotherObject];
}
[self dismissModalViewControllerAnimated:YES];
Oznacza to, że implementacja metody SecondDelegate wewnątrz elementu firstViewController będzie teraz wyglądać następująco:
- (void) secondViewControllerDismissed:(NSString*)stringForFirst argument2:(NSObject*)inObject1 argument3:(NSObject*)inObject2
{
NSString thisIsTheDesiredString = stringForFirst;
NSObject desiredObject1 = inObject1;
}