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
}
Ich könnte hier weit weg sein, aber ich fange an, die Blocksyntax dem sehr ausführlichen Delegaten- / Protokollansatz vorzuziehen. Wenn Sie vc2 aus vc1 erstellen, haben Sie eine Eigenschaft auf vc2, die Sie aus vc1 festlegen können, die ein Block ist!
Wenn dann in vc2 etwas passiert, von dem Sie vc1 erzählen möchten, führen Sie einfach den Block aus, den Sie in vc1 definiert haben!
Auf diese Weise können Sie Daten von VC2 zurück an VC1 senden. Genau wie Magie. IMO, das ist viel einfacher / sauberer als Protokolle. Blöcke sind fantastisch und müssen so weit wie möglich umarmt werden.
EDIT - Verbessertes Beispiel
Angenommen, wir haben eine Haupt-VC, auf der wir vorübergehend eine modale VC präsentieren möchten, um Eingaben von einem Benutzer zu erhalten. Um diese modalVC von mainVC zu präsentieren, müssen wir sie innerhalb von mainVC zuweisen / initiieren. Ziemlich einfaches Zeug. Wenn wir dieses modalVC-Objekt erstellen, können wir auch eine Blockeigenschaft festlegen, mit der wir problemlos zwischen beiden VC-Objekten kommunizieren können. Nehmen wir also das Beispiel von oben und fügen Sie die folgende Eigenschaft in die .h-Datei von modalVC ein:
Nachdem Sie in unserer mainVC ein neues modalVC-Objekt zugewiesen / initialisiert haben, legen Sie die Blockeigenschaft von modalVC folgendermaßen fest:
Wir setzen also nur die Blockeigenschaft und definieren, was passiert, wenn dieser Block ausgeführt wird.
Schließlich könnten wir in unserer modalVC einen tableViewController haben, der von einem dataSource-Array von Zeichenfolgen unterstützt wird. Sobald eine Zeilenauswahl getroffen ist, können wir Folgendes tun:
Und natürlich erhalten wir jedes Mal, wenn wir eine Zeile in modalVC auswählen, eine Konsolenausgabe von unserer NSLog-Zeile zurück in mainVC. Hoffentlich hilft das!
quelle
hmm, suchen Sie nach dem Benachrichtigungscenter und geben Sie Informationen in einer Benachrichtigung zurück. Hier ist Äpfel übernehmen - ich gehe persönlich vor, es sei denn, jemand hat andere Vorschläge
quelle
Definieren Sie ein Delegatenprotokoll im zweiten Ansichtscontroller und machen Sie das erste zum Delegaten des zweiten.
quelle