カスタムUIStoryboardSegue
を使用して、2つのビューコントローラー間の遷移を実装しようとしています。これを行うには、UIStoryboardSegue
をサブクラス化してから、このクラスをIBに設定します。しかし、私は次のようなドキュメントを見ていました。
セグエが追加情報を格納したり、performメソッド以外のものを提供したりする必要がない場合は、代わりにsegueWithIdentifier:source:destination:performHandler:メソッドの使用を検討してください。
カスタムサブクラスを作成する必要がないことを意味するのは、カスタムperformHandlerを使用するだけです。
このコードをどこに置くべきか、そしてどのように使用するかについて私は混乱しています。 IBで通常どおりセグエを作成し、それを起動する前にオーバーライドしますか(shouldPerformSegue:などで)。 Appleのドキュメントの他の場所には、次のように書かれています。
アプリがセグエオブジェクトを直接作成することはありません。セグエがトリガーされると、iOSによって常にユーザーに代わって作成されます
そのため、クラスクリエーターメソッドを使用してセグエをインスタンス化するように言われている理由がよくわかりません。
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;
}