0

2 シーンのストーリーボードがあります。各シーンには、ViewController アイコンから他のシーンに Ctrl キーを押しながらドラッグしたセグエがあります。最初のビューから 2 番目のビューへのセグエには識別子 "left" があり、2 番目から最初のビューへのセグエは "right" で、両方のセグエは UIStoryboardSegue から継承された同じカスタム クラスを指します。各 ViewController には Attribute Inspector でタイトルがあり、カスタム クラスはまだ割り当てられていません。

AppDelegate では、UISwipeGestureRecognizer を 4 方向すべてに設定し、現在のビュー コントローラーに "left"、"right"、"up"、または "down" の識別子を持つセグエがある場合にユーザーがどのようにスワイプするかに応じて、performSegueWithIdentifier を起動します。

- (void) handleSwipe:(UISwipeGestureRecognizer *) recognizer {
NSString *direction;
    switch ([recognizer direction]) {
        case UISwipeGestureRecognizerDirectionLeft:
            direction = @"left";
            break;
        case UISwipeGestureRecognizerDirectionUp:
            direction = @"up";
            break;
        case UISwipeGestureRecognizerDirectionDown:
            direction = @"down";
            break;
        default:
            direction = @"right";
            break;
    }
    @try {
        UIViewController *rootVC = self.window.rootViewController;
        [rootVC performSegueWithIdentifier:direction sender:rootVC];
    } @catch (NSException *e) {
        NSLog(@"Segue with identifier <%@> does not exist", direction);
    }
}

私のカスタム Segue クラスでは、次のように "perform" メソッドをオーバーライドします (このままでは壊れてしまうので特別なことはありませんが、後でセグエのカスタム アニメーションを作成できるようにオーバーライドします)。

-(void) perform {
    UIViewController *src = (UIViewController *) self.sourceViewController;
    UIViewController *dst = (UIViewController *) self.destinationViewController;

    NSLog(@"source: %@, destination: %@", src.title, dst.title);

    [src presentModalViewController:dst animated:NO];
}

ただし、左への最初のスワイプで一度だけ機能し、その後は何も起こりません。「実行」メソッドの NSLog を介して、この最初の遷移の後、セグエのソースと宛先のビュー コントローラーが何らかの理由で変更されず、それ以降は同じままであることを確認できます。簡単なものが欠けているように見えますが、わかりません。

私に厳しすぎないでください;)、私はiOS開発に不慣れです。

4

1 に答える 1

0

rootViewController で常にセグエを実行していて、セグエが単に呼び出しているためだと思いますpresentModalViewController。コントローラーは一度に 1 つのモーダルしか持つことができません。モーダルを表示し続けたい場合は、スタックの一番上にあるビュー コントローラーから表示する必要があります。それがあなたの意図するものかどうかはわかりません..コントローラースタックを逆方向にポップできるようにしたい場合を除き、モーダルを表示し続けることは本当に意味がありません.

実際にモーダルが必要ない場合は、セグエの rootViewController を宛先に置き換えるだけです。

-(void) perform {
    UIViewController *dst = (UIViewController *) self.destinationViewController;
    // do some animation first
    [[[UIApplication sharedApplication] delegate].window.rootViewController = dst;
}

また、質問で言及したように、アプリのデリゲートにジェスチャ認識機能があるのは非常に奇妙であることにも注意してください。スワイプ処理を行い、それ自体を呼び出す独自の UIViewController サブクラスを実装する方がはるかに理にかなっていますperformSegueWithIdentifier:

于 2012-07-08T07:52:13.963 に答える