2011-12-10 11 views
16

私は既に回答済みのものを求めていないことを願っています(しかし、これには答えが見つからなかったので、うまくいけば私はそうではありません)。performSegueWithIdentifierとsharedData

seguesとnavigationControllerを使用して、現在のxcodeバージョンのアプリがあります。あるビューから別のビューにデータを渡す必要があります。これを行う最も簡単な方法は何ですか?私はおそらくperformSegueWithIdentifierメソッドに夢中になるかもしれないが、それを使用する方法を知らないいくつかのsharedDataの事を走った(またはこれを行うのが正しい選択であるかどうか)。 sourceViewControllerdestinationViewController

おかげ

+1

実名を使用する場合は、ユーザー名を変更し、投稿に余分な行を入れないでください。 :) – mac

答えて

35

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

たとえば、ムービーのテーブルビューを持つマスタービューコントローラがあり、ユーザーがテーブルビューの行をクリックすると、ムービーのディテールビューコントローラにセグメンテーションしたいとします。

@implementation MasterViewController 

... 

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

これはまた、セグエの原点は、テーブルビューのセル、またはテーブルビューセルのアクセサリーボタン、sender引数であるときということは注目に値しますWWDC 2011

からIntroducing Interface Builder Storyboardingビデオで説明されていますprepareForSegue:sender:のテーブルビューセルです。

10

私は最良の方法は、segueを実行しているコントローラに表示されるビューコントローラのヘッダをインポートすることだと思います。そしてprepareForSegue内の必要なデータを渡すために、それのアクセサまたは他の方法を使用します。

// 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 
} 
+0

方法クール、ありがとうみんな! – Ondrej

2

あなたが戻ってデータをしたい:

// 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番目のデータが欲しいとき、私は、デリゲートを使用することをお勧め2番から1番へ、より良い方法はuse Unwind Seguesです。

関連する問題