web-dev-qa-db-ja.com

performSegueWithIdentifierとsharedData

すでに回答済みの質問をしていないことを願っています(ただし、回答が見つからなかったので、回答がないことを願っています)。

現在のxcodeバージョンで、seguesとnavigationControllerを使用したアプリがあります。あるビューから別のビューにデータを渡す必要があります-これを行う最も簡単な方法は何ですか?私はperformSegueWithIdentifierメソッドにフックされる可能性のあるいくつかのsharedDataに遭遇しましたが、それを使用する方法(またはこのようにするのが正しい選択であるかどうか)がわかりません。

ありがとう

16
Ondrej

セグエには、sourceViewControllerdestinationViewControllerの2つのビューコントローラーがあります。 UIKitがセグエを実行すると、prepareForSegue:sender:メッセージがソースVCに送信されます。ビューコントローラサブクラスでそのメソッドをオーバーライドして、データを宛先VCに渡すことができます。

たとえば、映画のテーブルビューを備えたマスタービューコントローラーがあり、ユーザーがテーブルビューの行をクリックしたときに、映画の詳細ビューコントローラーにセグエしたいとします。

@implementation MasterViewController

...

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    DetailViewController *detailVC = segue.destinationViewController;
    NSIndexPath *selectedPath = [self.tableView indexPathForSelectedRow];
    detailVC.movie = [self movieForIndexPath:selectedPath];
}

これは、WWDC 2011の Introducing Interface Builder Storyboarding ビデオで説明されています。

セグエのオリジンがテーブルビューセル、またはテーブルビューセルのアクセサリボタンである場合、prepareForSegue:sender:sender引数がテーブルビューセルであることも注目に値します。

34
rob mayoff

セグエを実行しているコントローラーに表示されるビューコントローラーのヘッダーをインポートするのが最善の方法だと思います。次に、アクセサまたは他のメソッドを使用して、prepareForSegue内で必要なデータを渡します。

// In FirstViewController.h

#import "SecondViewController.h"

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {

    if ([[segue identifier] isEqualToString:@"SegueToSecondViewController"]) {
        // Get destination view controller and don't forget
        // to cast it to the right class
        SecondViewController *secondController = [segue destinationViewController];
        // Pass data
        secondController.dataArray = self.someDataArray;
        secondController.name = @"Fancy name";
    }
}

データを2番目から1番目に戻したい場合は、デリゲートを使用することをお勧めします。

// In FirstViewController.h

#import "SecondViewController.h"
#import "SecondViewControllerDelegate.h"

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {

    if ([[segue identifier] isEqualToString:@"SegueToSecondViewController"]) {

        SecondViewController *secondController = [segue destinationViewController];

        // Declare first view controller as a delegate
        secondController.delegate = self;

        // Pass data
        secondController.dataArray = self.someDataArray;
        secondController.name = @"Fancy name";
    }
}

// Second controller's delegate method,controller
// ie. used to return data after second view is dismissed
- (void)secondControllerFinishedSomeTask:(NSArray *)someReturnedData {
    // Do something with returned data
}
10
Johnnywho

データを2番目から1番目に戻したい場合は、 nwind Seguesを使用 を使用することをお勧めします。

2
Amit Vyas