2012-12-31 15 views
5

Mögliche Duplizieren:
dismissModalViewController AND pass data backWie übergibt man einen Wert an den übergeordneten View-Controller?

Ich bin neu in ios Entwicklung und auf dieses Problem fest:

Ich bin mit Storyboards und einen Navigation-Controller haben, vcA, mit einem TableView darin, der einige Daten von einem MutableArray zeigt (der in viewdidload der gleichen Klasse initialisiert wird). Nach Auswahl einer Zelle wird ein zweiter View-Controller, vcB, mit einem TextField darin und einem Button namens "Add to list" angezeigt.

Was ich will ist, dass, wenn ich etwas Text in die TextField eingeben und drücken Sie die Schaltfläche "Add to list" sollte der Text zum Array der vorherigen Ansicht (die in der TableView angezeigt wird) und wenn ich tippe auf die "Zurück" auf der vcB Navigationsleiste, vcA sollte die aktualisierte TableView mit dem neuen Eintrag darin (auf der Oberseite der Liste) zeigen. Grundsätzlich möchte ich den Text von vcBTextField zu dem Array vcA hinzufügen und das neue Array nach dem Klicken auf die Schaltfläche BACK zeigen.

Ich habe viel über dieses Problem gesucht und scheint zu finden, dass Delegate und Protokolle der Weg ist, um das gewünschte Ergebnis zu erzielen, aber ich habe Probleme beim Verständnis der Delegation.

+2

[Was haben Sie versucht?] (Http://mattgemamm.com/2008/12/08/what-have-you-tried/) – Foggzie

+2

Dies wurde zu oft gefragt und beantwortet, um zu zählen. http://StackOverflow.com/a/6204427/1271826 – Rob

Antwort

13

Ich habe den zweiten View-Controller selbst als modal in diesem Beispiel präsentiert:

In der zweiten Ansicht-Controller h-Datei:

@protocol SecondViewControllerDelegate <NSObject> 
- (void)addItemViewController:(id)controller didFinishEnteringItem:(NSString *)item; 
@end 

@interface SecondPageViewController : UIViewController <UITextViewDelegate> 
{ 
    NSString *previouslyTypedInformation; 
} 

@property (weak, nonatomic) IBOutlet UITextView *textView; 
@property (nonatomic) NSString *previouslyTypedInformation; 
@property (nonatomic, weak) id <SecondViewControllerDelegate> delegate; 

In der zweiten Ansicht-Controller m-Datei stellen Sie sicher, Eigenschaften zu synthetisieren und add dann fügen sie diese:

- (IBAction)done:(id)sender 
{ 
    NSString *itemToPassBack = self.textView.text; 
    NSLog(@"returning: %@",itemToPassBack); 
    [self.delegate addItemViewController:self didFinishEnteringItem:itemToPassBack]; 
    //dismiss modal view controller here 
} 

dann in der ersten view-Controller h Datei legen sie es als Delegierter:

@interface FirstPageViewController: UIViewController <SecondViewControllerDelegate> 
@property (nonatomic) NSString *returnedItem; 

dann in den ersten m-Datei synthesize des View-Controller und fügen Sie die Methode:

- (void)addItemViewController:(SecondPageViewController *)controller didFinishEnteringItem: (NSString *)item 
{ 
    //using delegate method, get data back from second page view controller and set it to property declared in here 
    NSLog(@"This was returned from secondPageViewController: %@",item); 
    self.returnedItem=item; 

    //add item to array here and call reload 
} 

Jetzt haben Sie den Text von dem, was zurückgegeben! Sie können die Zeichenfolge in das Array in der ersten viewDidLoad Ansicht Controller hinzufügen und

[self.tableView reloadData]; 

nennen und es sollte funktionieren.

+1

Nur ein Zusatz, wo Sie Ihren zweiten View-Controller in Ihrem ersten initialisieren, tun: secondView.myDelegate = self; – hyd00

+0

gg13, danke! Die Frage für Ihre Antwort sollte lauten: "So erstellen Sie problemlos Delegierte". Ich fühlte mich verwirrt, und jetzt nicht einmal danach suchen, ich verstehe sie. –

+0

danke ... sehr viel .. –

Verwandte Themen