7

私はStoryboard自分のアプリで使用していて、あるビューから別のビューにデータを渡したいと思っています。

セグエを使用する代わりに、instantiateViewControllerWithIdentifier. この場合、2番目の でナビゲーションが必要なため、1番目の から2 番目の が接続TableViewControllerされたにインスタンス化します。ここで、クリックされた行に応じて、最初の から 2 番目の にデータを渡したいと思います。この場合は私ですが、私の問題は からにデータを渡す方法です。NavigationControllerTableViewControllerTableViewControllerTableviewControllerTableviewControllernewTopViewControllerNavigationControllerfirstTableViewControllersecondTableviewController

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


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




    }

ここに画像の説明を入力

4

4 に答える 4

17

navigationController をインスタンス化する場合、viewControllersプロパティを使用して、ナビゲーション コントローラーの内部の viewController を取得できます。

このようなもの:

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];
于 2013-04-07T07:35:03.597 に答える
5
newTopViewController.anyVariableToShow= anyVariableToSend;

私はこれをいくつかのアプリでかなり頻繁に行います...

// 新しい 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];

ナビゲーション コントローラーやセグエを使用していない場合は、アプリの設計を再検討する必要があると思います。

于 2013-04-05T12:02:01.923 に答える
0

実際には、これはプログラム制御とデータ転送の問題であるため、単なるデータパスの問題ではありません。ストーリーボードの意味を持たずにストーリーボードを使用したいので、アプリのコンセプトについて再考する必要があります。

したがって、セグエを使用しないことにした場合、新しいコントローラーをインスタンス化し、それを使用してデータを転送するための新しく快適な方法を失い、制御とデータの転送を 2 つの異なる手順で行う必要があります。ストーリーボードで別のシーンをインスタンス化するとき (instantiateViewControllerWithIdentifier:) で行うように、新しいコントローラーをインスタンス化し、コントロールを転送しましたが、データは転送しませんでした。古い方法で xib から新しいコントローラーをインスタンス化したと考えてみてください (ストーリーボードが initWithName:bundle: を呼び出さないため、2 番目のビュー コントローラーで initWithCoder: または awakeFromNib を使用する必要があります)。 .

したがって、新しいコントローラー (2 番目のストーリーボードの ID 部分で名前が付けられています) があり、他のものとの関係や接続なしで宇宙にぶら下がっています (ストーリーボードの図がそれをうまく示しています)。したいです。

何かをしたいので、前のストーリーボード (ViewController) からのデータが必要です。必要なのは、これらのデータを 2 番目のストーリーボード (ViewController) で利用できるようにすることです。ご存知のように、ストーリーボードが存在するずっと前から利用できるソリューションがたくさんあります。

したがって、コードに関して、「データ転送」は、2つのコントローラーが互いのサブクラスであるかどうかにかかわらず、設計によって異なります...

サブクラス化を扱いたくなく、可能な限り分離したい場合は、最初のコントローラーでデータのプロパティを作成し、2 番目のコントローラーからそれらを参照するのが最善の方法です (最初の .h ファイルをインポートした後)。 viewDidLoad または initWithCoder: または必要な場所で参照するだけです。

secondViewControllerdata = firstViewControllerdata.thatDataProperty

もちろん、同じことを逆にして、2 番目のコントローラーのプロパティを作成し、最初のビュー コントローラーで参照することもできます。

于 2013-04-07T13:41:26.417 に答える