web-dev-qa-db-ja.com

iOS 6-セグエをほどくとデータを返すことができますか?

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

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

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

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

25
Mark Tyers

ジェフに感謝します。視聴後WWDCビデオ407明確な解決策があります。

巻き戻しのターゲットであるビューコントローラーで、単一のUIStoryboardSegueパラメーターを受け取り、IBActionを返すメソッドを作成する必要があります。 UIStoryboardSegueには、ソースビューコントローラを返すメソッドがあります。これはビデオから取った例です(Appleへのクレジット)。

- (IBAction)done:(UIStoryboardSegue *)segue {
    ConfirmationViewController *cc = [segue sourceViewController];
    [self setAccountInfo:[cc accountInfo]];
    [self setShowingSuccessView:YES];
}
35
Mark Tyers

巻き戻しセグエからデータを取得することは、このAppleトーク、後半の プレゼンテーション で非常にうまく説明されています(編集:37:20から開始))

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

11
Jeff

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

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

この関数はbeforeunwindと呼ばれます。セグエが呼び出されます(例では、quitQuizと呼びます)。ご覧のとおり、senderパラメータもあるので、だれがアンワインドを呼び出したのかを見つけ、それに応じて関連データを収集できます。

WWDC 407ビデオの例では、リセットボタンをクリックした場合、notでaccountInfoを設定し、完了ボタンをクリックした場合は、設定します。

5
Yasmin Tiomkin

はい
そのためには、別のビューコントローラーから送信されるデータを保持するプロパティを作成する必要があります。

    - (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];
        }
    }
1
Nitesh Borad

デリゲートを設定し、クイズの終了とデータの返信についてソース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;
}
1
Mundi

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:メソッドを処理します。

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

0
Jesse Bunch