Sie müssen Delegate-Protokolle verwenden ... So geht's:
Deklarieren Sie ein Protokoll in der Header-Datei Ihres secondViewController. Es sollte so aussehen:
#import <UIKit/UIKit.h>
@protocol SecondDelegate <NSObject>
-(void)secondViewControllerDismissed:(NSString *)stringForFirst
@end
@interface SecondViewController : UIViewController
{
id myDelegate;
}
@property (nonatomic, assign) id<SecondDelegate> myDelegate;
Vergessen Sie nicht, das myDelegate in Ihrer Implementierungsdatei (SecondViewController.m) zu synthetisieren:
@synthesize myDelegate;
Abonnieren Sie in der Header-Datei Ihres FirstViewController das SecondDelegate-Protokoll folgendermaßen:
#import "SecondViewController.h"
@interface FirstViewController:UIViewController <SecondDelegate>
Wenn Sie jetzt SecondViewController in FirstViewController instanziieren, sollten Sie Folgendes tun:
// If you're using a view controller built with Interface Builder.
SecondViewController *second = [[SecondViewController alloc] initWithNibName:"SecondViewController" bundle:[NSBundle mainBundle]];
// If you're using a view controller built programmatically.
SecondViewController *second = [SecondViewController new]; // Convenience initializer that uses alloc] init]
second.myString = @"This text is passed from firstViewController!";
second.myDelegate = self;
second.modalTransitionStyle = UIModalTransitionStyleCrossDissolve;
[self presentModalViewController:second animated:YES];
[second release];
Zuletzt implementieren Sie in der Implementierungsdatei für Ihren First View Controller (FirstViewController.m) die SecondDelegate-Methode für secondViewControllerDismissed:
- (void)secondViewControllerDismissed:(NSString *)stringForFirst
{
NSString *thisIsTheDesiredString = stringForFirst; //And there you have it.....
}
Wenn Sie nun den zweiten Ansichts-Controller schließen möchten, möchten Sie die im ersten Ansichts-Controller implementierte Methode aufrufen. Dieser Teil ist einfach. Alles, was Sie tun, ist, in Ihrem zweiten Ansichts-Controller vor dem Entlassungscode einen Code hinzuzufügen:
if([self.myDelegate respondsToSelector:@selector(secondViewControllerDismissed:)])
{
[self.myDelegate secondViewControllerDismissed:@"THIS IS THE STRING TO SEND!!!"];
}
[self dismissModalViewControllerAnimated:YES];
Delegate-Protokolle sind EXTREM, EXTREM, EXTREM nützlich. Es würde dir gut tun, dich mit ihnen vertraut zu machen :)
NSNotifications sind eine weitere Möglichkeit, dies zu tun. Als bewährte Methode bevorzuge ich die Verwendung, wenn ich über mehrere viewController oder Objekte hinweg kommunizieren möchte. Hier ist eine Antwort, die ich zuvor gepostet habe, wenn Sie neugierig auf die Verwendung von NSNotifications sind: Auslösen von Ereignissen über mehrere Viewcontroller aus einem Thread in der Appdelegate
BEARBEITEN:
Wenn Sie mehrere Argumente übergeben möchten, sieht der Code vor dem Entlassen folgendermaßen aus:
if([self.myDelegate respondsToSelector:@selector(secondViewControllerDismissed:argument2:argument3:)])
{
[self.myDelegate secondViewControllerDismissed:@"THIS IS THE STRING TO SEND!!!" argument2:someObject argument3:anotherObject];
}
[self dismissModalViewControllerAnimated:YES];
Dies bedeutet, dass Ihre Implementierung der SecondDelegate-Methode in Ihrem firstViewController nun wie folgt aussieht:
- (void) secondViewControllerDismissed:(NSString*)stringForFirst argument2:(NSObject*)inObject1 argument3:(NSObject*)inObject2
{
NSString thisIsTheDesiredString = stringForFirst;
NSObject desiredObject1 = inObject1;
//....and so on
}