2013-04-05 10 views
6

Ich verwende Storyboard in meiner App und ich möchte Daten von einer Ansicht zu einer anderen Ansicht übergeben.instanziateViewControllerWithIdentifier und übergeben Daten

Anstatt Segmente zu verwenden, verwende ich instantiateViewControllerWithIdentifier. In diesem Fall bin ich instanziiert von meinem ersten TableViewController zu einem NavigationController, der eine zweite TableViewController hat, weil ich die Navigation in der zweiten TableViewController angehängt habe. Jetzt möchte ich Daten von meiner ersten TableviewController, je nachdem welche Zeile geklickt wurde, an meine zweite TableviewController übergeben. In diesem Fall wäre newTopViewController mein NavigationController aber mein Problem ist jetzt, wie man Daten von firstTableViewController an die secondTableviewController weiterleitet.

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
    { 
     NSString *identifier = [NSString stringWithFormat:@"%@Top", [menuArray objectAtIndex:indexPath.row]]; 


     UIViewController *newTopViewController = [self.storyboard instantiateViewControllerWithIdentifier:identifier]; 




    } 

enter image description here

+0

möglich Duplikat [Geben von Daten zwischen View-Controller] (http://stackoverflow.com/questions/5210535/passing-data-between-view-controllers) –

+0

Ich sehe nicht, eine Lösung in diesem Beitrag. Ich verwende den Instantiate-Controller, weil ich keine Segmente verwende. Also kann ich immer noch PreparedForseGue verwenden, gibt es keine Überfahrt? – halloway4b

+0

Wo ein View-Controller instanziiert wird, sollte nicht ändern, wie Sie Nachrichten an ihn übergeben. –

Antwort

14

Wenn Sie einen navigationController instanziieren, können Sie mit der Eigenschaft viewControllers den inneren viewController des Navigationscontrollers abrufen.

Etwas wie folgt aus:

UINavigationController *navigationController = [self.storyboard instantiateViewControllerWithIdentifier:identifier]; 
MBFancyViewController *viewController = navigationController.viewControllers[0]; 

// setup "inner" view controller 
viewController.foo = bar; 

[self presentViewController:navigationController animated:YES completion:nil]; 
+0

Sie haben es geschafft. Danke vielmals. Mit diesem Hinweis habe ich herausgefunden, dass UINavigationController eine Eigenschaft namens topViewController hat. Danke vielmals. Funktioniert wie ein Zauber in beiden Richtungen. Ich habe deine Antwort mit der anderen Möglichkeit bearbeitet. – halloway4b

+0

Erstaunliche Lösung. Es hat mir sehr geholfen. Danke vielmals –

5
newTopViewController.anyVariableToShow= anyVariableToSend; 

ich auf ein paar meiner apps dies ziemlich oft tun ...

// Neues VC

CookViewController *detailViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"CookVC"]; 

//Set recipe 
[detailViewController setRecipe:recipe]; 

//Pop over VC (can be pushed with a nav controller) 
[self presentPopupViewController:detailViewController animationType:MJPopupViewAnimationFade]; 

Wenn Sie nicht sind Mit einem Navigationscontroller oder -segmenten, dann denke ich, dass Sie Ihr App-Design überdenken müssen.

+0

newTopViewController ist ein NavigationController, aber ich möchte die Daten an meine secondTableViewController übergeben. – halloway4b

+0

Neue Top-Shows als View-Controller –

+0

Wenn ich sage newTopViewController.title = @ "Was auch immer"; Der Titel ändert sich nicht, da der SecondTableViewController mit einer Navigationsleiste angezeigt wird. Wenn ich den secondTableViewController direkt instantiieren würde, könnte ich die Daten wie secondTableViewController.title = @ "Whatever" weitergeben, aber ich habe keine Navigationsleiste in meiner Tabellenansicht. – halloway4b

0

Eigentlich ist es nicht nur ein Datendurchlauf Problem, da diese zusammen eine Programmsteuerung und Datenübertragung Frage. Selbst wenn Sie das Konzept Ihrer App überdenken müssten, da Sie Storyboard ohne die Bedeutung eines Storyboards verwenden möchten, liegt es an Ihnen, und ich hoffe, Sie haben einen guten Grund, das zu tun, was Sie tun.

Wenn Sie also entschieden haben, segue nicht zu verwenden, haben Sie die neue und komfortable Möglichkeit verloren, einen neuen Controller zu instanziieren und Daten zu übertragen, und Sie müssen die Kontrolle und die Daten in zwei getrennten Schritten übertragen. Wenn Sie eine andere Szene im Storyboard instanziieren (wie bei instantiateViewControllerWithIdentifier :), haben Sie gerade einen neuen Controller instanziiert und das Steuerelement, aber nicht die Daten übertragen. Denken Sie darüber nach, wie Sie einen neuen Controller von einem xib auf eine alte Art instanziiert haben (Sie müssen also initWithCoder: oder watchFromNib im zweiten View-Controller verwenden, da das Storyboard initWithName: bundle :) nicht aufruft, aber nichts mehr getan hat .

Sie haben also einen neuen Controller (der im Identity-Teil des zweiten Storyboards benannt ist), der im Universum hängt, ohne irgendeine Beziehung oder Verbindung mit irgendetwas anderem (wie das Storyboardbild es schön illustriert) damit was du willst.

Sie möchten also etwas tun und Sie benötigen Daten aus dem vorherigen Storyboard (ViewController). Was Sie brauchen, ist, diese Daten dem zweiten Storyboard (ViewController) zur Verfügung zu stellen, und wie Sie wissen, gibt es viele Lösungen dafür, die lange verfügbar waren, bevor ein Storyboard existiert.

Also in Bezug auf Ihren Code hängt die "Datenübertragung" von Ihrem Design ab, ob die beiden Controller Unterklassen voneinander sind oder was auch immer ...

Wenn Sie nicht gerne mit Unterklassen umgehen und sie so oft wie möglich entkoppeln möchten, machen Sie am besten eine Eigenschaft Ihrer Daten in der ersten Steuerung und beziehen Sie sich von der zweiten (nach dem Importieren der Ersten) .h-Datei) und beziehen sich nur um es in seiner viewDidLoad oder in initWithCoder: oder überall dort, wo Sie sie brauchen, wie

secondViewControllerdata = firstViewControllerdata.thatDataProperty 

natürlich können Sie das gleiche in umgekehrter Richtung tun und eine Eigenschaft des zweiten Controllers machen und verweisen dazu in Ihrem ersten View-Controller.

0

Sie können einige Parameter in UIViewController definieren, zum Empfangen von Daten:

@property (Assign) int param1;

@Eigenschaft (behalten) NSMutableArray * param2;

und Verwendung unter den Daten zu übergeben:

[newTopViewController setParam1: XX];

[newTopViewController setParam2: XX];

Verwandte Themen