6

私の質問は、次のカスタム アンワインド セグエを、iOS 9 より前のバージョンのデバイスと iOS 9 を実行しているデバイスで動作させるにはどうすればよいですか?

ビューコントローラーを表示するカスタムセグエがあり、対応するカスタムアンワインドセグエがあります。このコードは iOS 8 で正常に動作し、UIStoryboardSegue のサブクラスを作成してperformメソッドを実装することで実装されます。次に、カスタム ナビゲーション コントローラーで次のメソッドをオーバーライドします。

- (UIStoryboardSegue *) segueForUnwindingToViewController:    (UIViewController *)toViewController fromViewController:(UIViewController *)fromViewController identifier:(NSString *)identifier
{
    UIStoryboardSegue *segue;
    if([fromViewController isKindOfClass:[MyViewController class]]){
        segue = [[CustomSegue alloc] initWithIdentifier:identifier source:fromViewController destination:toViewController]; //Custom Unwind Segue
    }
    else{
        UIStoryboardSegue *unwindSegue = [super segueForUnwindingToViewController:toViewController fromViewController:fromViewController identifier:identifier]; //Normal Unwind Segue
        segue = unwindSegue;
    }
    return segue;
}

iOS 9 では、segueForUnwindingToViewController非推奨です。MyViewController CustomSegue では引き続き機能します。ただし、デフォルトのアンワインド セグエは、他のアンワインド セグエでは機能しなくなりました。super でメソッドを呼び出すとアンワインド セグエが返されますが、セグエは発生せず、View Controller はポップされず、ユーザーは前の画面に戻ることができません。したがって、明確にするために、通常の show セグエを使用すると、対応するアンワインド セグエが非推奨のメソッドを呼び出します。このメソッドはスーパーでメソッドを呼び出し、機能しません。

ストーリーボードで WWDC の話を見て、iOS 9 でこの問題を修正することができました。a) カスタム ナビゲーション コントローラーでこのメソッドをオーバーライドしなくなりました。b) ストーリーボードに移動し、カスタム セグエをクリックして入力します。CustomSegueセグエクラスとして。残念ながら、私は iOS 7 をターゲットにしているため、「iOS 9 より前のクラス名をサポートするのはカスタム セグエのみです」という警告が表示され、カスタム アンワインド セグエは iOS 7 または iOS 8 では機能しません。

4

2 に答える 2

3

多くの試行錯誤の後、回避策を見つけました。segueForUnwindingToViewControllerオーバーライドすると、unwindForSegue:towardsViewControllerが呼び出されなくなったことに気付きました。これが問題です。参考までに、UIViewControllerのAppleのメモには次のように書かれていsegueForUnwindingToViewControllerます:

非推奨。メソッドを介してソース ビュー コントローラーから宛先ビュー コントローラーに巻き戻すセグエを返しますunwindForSegue:towardViewController:。ストーリーボードで定義されたアンワインド セグエを実行するときに、アンワインド パスに沿ったいずれかのビュー コントローラーがこのメソッドをオーバーライドし、非 nil を返す場合、ランタイムは、Interface Builder で指定されたクラスのインスタンスを構築する代わりに、そのセグエ オブジェクトを使用します。

ステートメントの太字の部分は実装されていないようです。つまり、このメソッドをオーバーライドして nil を返すunwindForSegue:towardViewControllerと、まだ呼び出されず、セグエは発生しません。

この問題を回避するためsegueForUnwindingToViewControllerに、カスタム ナビゲーション コントローラーでを編集することができました。

- (UIStoryboardSegue *)segueForUnwindingToViewController:(UIViewController *)toViewController fromViewController:(UIViewController *)fromViewController identifier:(NSString *)identifier
{
    UIStoryboardSegue *segue;
    if([fromViewController isKindOfClass:[MyViewController class]]){
        segue = [[CustomSegue alloc] initWithIdentifier:identifier source:fromViewController destination:toViewController]; //Custom Unwind Segue
    }
    else{
        if([[UIDevice currentDevice].systemVersion floatValue] < 9.0){
            return [super segueForUnwindingToViewController:toViewController fromViewController:fromViewController identifier:identifier]; //Normal Unwind Segue
        }
        else{
            [super unwindForSegue:segue towardsViewController:toViewController];
            return nil;
        }
    }
    return segue;
}

更新:呼び出し[super segueForUnwindingToViewController:toViewController fromViewController:fromViewController identifier:identifier];は、モーダル アンワインド セグエで引き続き機能するようです。私が説明した問題は、ショーのセグエで発生するようです。したがって、デバイスがバージョン 9.0 未満で実行されている場合、またはセグエがモーダルである場合でも、古いメソッドを呼び出す必要があります。[super unwindForSegue:segue towardsViewController:toViewController];セグエがモーダルのときに呼び出すと、セグエは機能しません/発生しません。

于 2015-09-24T04:42:02.250 に答える
1

コードを少し変更しました。
プッシュかモーダルかを考慮する必要はありません。
それはうまくいくようです。

- (UIStoryboardSegue *)segueForUnwindingToViewController:(UIViewController *)toViewController fromViewController:(UIViewController *)fromViewController identifier:(NSString *)identifier
{
    UIStoryboardSegue *segue;
    if ([fromViewController isKindOfClass:[MyViewController class]]) {
        segue = [[CustomSegue alloc] initWithIdentifier:identifier source:fromViewController destination:toViewController]; //Custom Unwind Segue
    }
    else {
        if ([super respondsToSelector:@selector(unwindForSegue:towardsViewController:)]) {
            [super unwindForSegue:segue towardsViewController:toViewController];
        }
        segue = [super segueForUnwindingToViewController:toViewController fromViewController:fromViewController identifier:identifier];
    }

    return segue;
}
于 2015-09-28T05:00:43.607 に答える