25

ストーリーボードツールを使用して、簡単なアンワインドセグエを作成しました。巻き戻したいビューに次のイベントハンドラーを作成しました。

-(IBAction)quitQuiz:(UIStoryboardSegue *)segue {
    NSLog(@"SEGUE unwind");
}

これは正しく起動し、セグエを巻き戻します(メッセージはログに記録されます)。

ユーザーがクイズをやめたとき、私はいくつかのデータを返したいと思っており、これを達成する方法に苦労しています。誰かアドバイスできますか?

4

6 に答える 6

35

ありがとうジェフ。WWDC ビデオ 407を見た後、明確な解決策があります。

アンワインドのターゲットであるビュー コントローラーで、単一の UIStoryboardSegue パラメーターを受け取り、IBAction を返すメソッドを作成する必要があります。UIStoryboardSegue には、ソース ビュー コントローラーを返すメソッドがあります。これはビデオから取られた例です(Appleの功績による)。

- (IBAction)done:(UIStoryboardSegue *)segue {
    ConfirmationViewController *cc = [segue sourceViewController];
    [self setAccountInfo:[cc accountInfo]];
    [self setShowingSuccessView:YES];
}
于 2012-10-28T09:21:00.933 に答える
11

アンワインド セグエからデータを取得する方法については、プレゼンテーションの後半のこのアップル トークで非常にうまく説明されています (編集: 37:20 から開始)。

特に、巻き戻しセグエでは、[segue sourceViewController] は、巻き戻しイベントの発生元であるアクティブなビュー コントローラーであるため、通常どおりプロパティにアクセスするだけです。

于 2012-10-26T15:50:57.153 に答える
5

閉じているコントローラーに関数 prepareForSeque を追加します。

-(void) prepareForSegue :(UIStoryboardSegue *)segue 送信者:(id)送信者

この関数は、巻き戻しセグエが呼び出されるに呼び出されます (あなたの例では、それを quitQuiz と呼びました)。ご覧のとおり、これには送信者パラメーターも含まれているため、誰がアンワインドを呼び出したかを特定し、それに応じて関連データを収集できます。

WWDC 407 ビデオの例では、リセット ボタンをクリックすると accountInfo が設定されず、完了ボタンをクリックすると設定されます。

于 2012-12-31T11:31:45.053 に答える
1

デリゲートを設定し、クイズを終了してデータを送り返すことについてソース ビュー コントローラーに通知します。ソース ビュー コントローラーを宛先ビュー コントローラーのデリゲートとして設定することを忘れないでください。

// DestinationViewController.h
@protocol DestingationDelegate;
@interface 
...
@property (assign) id<DestinationDelegate> delegate;
...
@end

@protocol DestinationDelegate
-(void)didQuitQuiz:(NSDictionary*)infoDict;
@end

// DestinationViewController.m
-(IBAction)quitQuiz:(UIStoryboardSegue *)segue {
  NSLog(@"SEGUE unwind");
  if (self.delegate) [self.delegate didQuitQuiz:infoDict];
}


// SourceViewController.h
#import DestinationViewController.h
@interface SourceViewController : ViewController <DestinationDelegate>
....

// SourceViewController.m
-(void)didQuitQuiz:(NSDictionary *)infoDict {
    if (infoDict) {
       // do something with the data
    }
}

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
   ...
   destinationViewController.delegate = self;
}
于 2012-10-23T20:32:31.020 に答える
0

ビュー コントローラ間でのデータの受け渡しは、多くの場合、プロトコルを使用して行われます。次に例を示します。

クイズ ビュー コントローラーのヘッダーで、同様のプロトコル定義を宣言します。

@protocol JBQuizViewControllerDelegate <NSObject>

@required
- (void)quizController:(id)controller didQuitWithState:(NSString *)state;

@end

表示するビュー コントローラーのprepareForSeque:メソッドで、デリゲートを接続します。

JBQuizViewController *destination = (JBQuizViewController *)segue.destinationViewController;
destination.delegate = self;

次に、表示側のビュー コントローラーで、デリゲート プロトコルのquizController:didQuitWithState:メソッドを処理します。

最後に、ユーザーがクイズを終了したら、プロトコルを使用してデリゲートに通知し、状態または公開するデータを渡す必要があります。

于 2012-10-23T20:31:03.447 に答える