0

アプリのルート ビュー コントローラーの第 1 レベルに追加したパン ジェスチャを使用して、ユーザーが任意の場所をスワイプしてナビゲーション スタックの前のレベルに移動できるようにします (ジェスチャは、黒くなるのを防ぐために 0 レベルではありません)穴 :) )。これは機能しており、iOS 7 より前のバージョンでも問題なく機能します。

iOS 7 を使用してスワイプ バックしようとすると、コンソールに次のメッセージが表示されます。ナビゲーション バーのサブビュー ツリーが破損する場合があります。

この時点では、アプリはクラッシュしていません。

次に、もう一度スワイプして前のレベルに戻そうとすると、クラッシュします。iOS 7 でこのバグが発生した理由と、それを修正する方法を理解しようとしています。どんな助けでも正当にそして大いに感謝します!

これが私のコードです:

RootViewController.m:

- (void)viewDidLoad
{
    [super viewDidLoad];
UIPanGestureRecognizer *pan = [[UIPanGestureRecognizer alloc]initWithTarget:self action:@selector(pop:)];

    pan.delegate = self;

    [self.view addGestureRecognizer:pan];
}

- (void)pop:(UIPanGestureRecognizer*)pan
{
    if (pan.state == UIGestureRecognizerStateBegan || pan.state == UIGestureRecognizerStateChanged)
    {
        CGPoint vel = [pan velocityInView:self.view];

        if (vel.x > 1000)
        {
            [self.navigationController popViewControllerAnimated:YES];
        }
    }
}
4

3 に答える 3

1

UINavigationController のスタックに現在のコントローラーの戻るボタンが表示されている場合、ユーザーは画面の左端から右にスワイプして戻ることができます。アプリが iOS7 で実行されている場合は、パン ジェスチャ レコグナイザーを追加しないことを検討することをお勧めします。

でiOSのバージョンを確認できます[UIDevice currentDevice].systemVersion

ジェスチャ レコグナイザーを追加して、ユーザーがどこでもスワイプして戻れるようにするという質問があったことは承知していますが、(うまくいけば) iOS7 ユーザーは、画面の左端からのスワイプにすぐに慣れるでしょう。

于 2013-09-19T20:45:41.410 に答える
1

問題はあなたの状態にあると思います。UIGestureRecognizerStateBegan と UIGestureRecognizerStateChanged をテストすることにより、デリゲートは多くのポップをトリガーしています (これらはアニメーション化されているため、前のポップがまだアニメーション化されている間に次のポップがトリガーされます)。

if (pan.state == UIGestureRecognizerStateEnded)代わりに、必要なものだけを取得するためにテストしてください。

また、NavVC が既にルートにある場合、どこにも飛び出さなくても心配する必要はありません。ルートをポップしないほど賢いです。

(これが os7 でのみ誤動作する理由については、< ios7 ロジックが pop プロセスの初期段階でジェスチャ認識機能を削除すると推測することしかできません)。

于 2013-09-19T20:36:52.177 に答える
0

速度が 1000 に達すると、関数が呼び出されるたびにビューコントローラーがポップされ、アニメーションが YES の場合、ビューコントローラーがポップされる前に数回呼び出され、クラッシュが発生します。

于 2013-09-19T20:35:45.443 に答える