web-dev-qa-db-ja.com

segueWithIdentifier:source:destination:performHandlerを使用したカスタムUIStoryboardSegue:

カスタムUIStoryboardSegueを使用して、2つのビューコントローラー間の遷移を実装しようとしています。これを行うには、UIStoryboardSegueをサブクラス化してから、このクラスをIBに設定します。しかし、私は次のようなドキュメントを見ていました。

セグエが追加情報を格納したり、performメソッド以外のものを提供したりする必要がない場合は、代わりにsegueWithIdentifier:source:destination:performHandler:メソッドの使用を検討してください。

カスタムサブクラスを作成する必要がないことを意味するのは、カスタムperformHandlerを使用するだけです。

このコードをどこに置くべきか、そしてどのように使用するかについて私は混乱しています。 IBで通常どおりセグエを作成し、それを起動する前にオーバーライドしますか(shouldPerformSegue:などで)。 Appleのドキュメントの他の場所には、次のように書かれています。

アプリがセグエオブジェクトを直接作成することはありません。セグエがトリガーされると、iOSによって常にユーザーに代わって作成されます

そのため、クラスクリエーターメソッドを使用してセグエをインスタンス化するように言われている理由がよくわかりません。

19
Jazzer

segueWithIdentifier:source:destination:performHandler:のポイント

  • セグエサブクラスを作成せずにカスタムトランジションも作成する場合は、UIViewController performSegueWithIdentifier:senderの代替を提供します。
  • segueForUnwindingToViewController:fromViewController:identifierのリターンとして使用できるセグエを販売する

上記のように、このアプローチは、手動で呼び出すセグエに対してのみ実行可能です。つまり、IBトリガーを介してトリガーされるセグエに対しては実行できません。

したがって、たとえば、特定のタイムアウト期間の後にトリガーする必要があるセグエ(カスタムロック画面など)がある場合は、segueWithIdentifier:source:destination:performHandler:を使用してカスタム遷移を処理できます。

-(void)appTimeoutLockScreen
{
    UIStoryboardSegue *segue = 
                [UIStoryboardSegue segueWithIdentifier:@"LockScreenSegue" 
                                                source:sourceVC 
                                           destination:destinationVC 
                                        performHandler:^{
                     // transition code that would 
                     // normally go in the perform method
                }];
    // Dev is responsible for calling prepareForSegue and perform.
    // Note, the order of calls for an IB triggered segue as well as
    // a performSegueWithIdentifier segue is perform first, then
    // prepareForSegue:sender. Manual segues need to inverse the call
    // in order to ensure VC setup is finished before transition.
    [self prepareForSegue:segue sender:self];
    [segue perform];
}

この方法のもう1つの実用的な用途は、セグエをほどくことです。前の例と同様のシナリオを使用して、ロック画面から前のviewControllerに戻るためのセグエを返すために使用できます。

-(UIStoryboardSegue *)segueForUnwindingToViewController:(UIViewController*)toVC 
                                     fromViewController:(UIViewController *)fmVC
                                             identifier:(NSString *)identifier
{
    UIStoryboardSegue *segue = 
            [UIStoryboardSegue segueWithIdentifier:@"FromLockScreenSegue" 
                                            source:fmVC
                                       destination:toVC 
                                    performHandler:^{
                // transition code
            }];

    return segue;
}
18
memmons