ストーリーボードツールを使用して、簡単な巻き戻しセグエを作成しました。巻き戻したいビューに次のイベントハンドラーを作成しました。
-(IBAction)quitQuiz:(UIStoryboardSegue *)segue {
NSLog(@"SEGUE unwind");
}
これは正しく起動し、セグエをほどきます(メッセージがログに記録されます)。
ユーザーがクイズをやめるとき、私はいくつかのデータを返したいと思って、これを達成する方法に苦労していました。誰かアドバイスできますか?
ジェフに感謝します。視聴後WWDCビデオ407明確な解決策があります。
巻き戻しのターゲットであるビューコントローラーで、単一のUIStoryboardSegueパラメーターを受け取り、IBActionを返すメソッドを作成する必要があります。 UIStoryboardSegueには、ソースビューコントローラを返すメソッドがあります。これはビデオから取った例です(Appleへのクレジット)。
- (IBAction)done:(UIStoryboardSegue *)segue {
ConfirmationViewController *cc = [segue sourceViewController];
[self setAccountInfo:[cc accountInfo]];
[self setShowingSuccessView:YES];
}
巻き戻しセグエからデータを取得することは、このAppleトーク、後半の プレゼンテーション で非常にうまく説明されています(編集:37:20から開始))
特に、アンワインドセグエでは、[segue sourceViewController]はアンワインドイベントの発生元であるアクティブなビューコントローラであるため、通常どおりプロパティにアクセスします。
閉じているコントローラに関数prepareForSequeを追加します。
void)---(prepareForSegue :( UIStoryboardSegue *)segue sender:(id)sender
この関数はbeforeunwindと呼ばれます。セグエが呼び出されます(例では、quitQuizと呼びます)。ご覧のとおり、senderパラメータもあるので、だれがアンワインドを呼び出したのかを見つけ、それに応じて関連データを収集できます。
WWDC 407ビデオの例では、リセットボタンをクリックした場合、notでaccountInfoを設定し、完了ボタンをクリックした場合は、設定します。
はい、
そのためには、別のビューコントローラーから送信されるデータを保持するプロパティを作成する必要があります。
- (IBAction)unwindSelectFriendsVC:(UIStoryboardSegue *)segue
{
if ([segue.sourceViewController isKindOfClass:[ChildVC class]]) {
ChildVC *child = (ChildVC *) segue.sourceViewController;
//here we are passing array of selected friends by arrSelectedFriends property
self.arrFriendList = child.arrSelectedFriends;
[self.tableView reloadData];
}
}
デリゲートを設定し、クイズの終了とデータの返信についてソースView Controllerに通知します。ソースビューコントローラーを宛先ビューコントローラーのデリゲートとして設定することを忘れないでください。
// 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;
}
View Controller間でのデータの受け渡しは、プロトコルを使用して頻繁に行われます。次に例を示します。
クイズビューのコントローラーヘッダーで、同様のプロトコル定義を宣言します。
@protocol JBQuizViewControllerDelegate <NSObject>
@required
- (void)quizController:(id)controller didQuitWithState:(NSString *)state;
@end
表示するビューコントローラーのprepareForSeque:
メソッドで、デリゲートを接続します。
JBQuizViewController *destination = (JBQuizViewController *)segue.destinationViewController;
destination.delegate = self;
次に、表示するビューコントローラーで、デリゲートプロトコルのquizController:didQuitWithState:
メソッドを処理します。
最後に、ユーザーがクイズを終了したら、プロトコルを使用してデリゲートに通知し、状態または公開するデータを渡します。