28

iOS 7 の新しいスワイプ トゥ ポップ ジェスチャは、View Controller のライフサイクルにどのような影響を与えますUINavigationControllerか?

4

3 に答える 3

47

iOS 7 の新機能は、スワイプしてポップするジェスチャUINavigationControllerです。指を左から右にスワイプして、通常戻るボタンで行うことを行うことができます。注意しなければならないのは、ポップ遷移がキャンセル可能であることです。

戻るボタンをタップしても、期待どおりに機能します。

  1. ユーザーが戻るボタンをタップ
  2. viewWillDisappearと呼ばれる
  3. viewDidDisappearと呼ばれる
  4. ポップされたコントローラーがリリースされます

スワイプ トゥ ポップの完了は、戻るボタンをタップするようなものです

  1. ユーザーが左から右にスワイプし始める
  2. viewWillDisappearと呼ばれる
  3. ユーザーがスワイプ ジェスチャを完了する
  4. viewDidDisappearと呼ばれる
  5. ポップされたコントローラーがリリースされます

キャンセルされたスワイプ トゥ ポップは次のように機能します

  1. ユーザーが左から右にスワイプし始める
  2. viewWillDisappearと呼ばれる
  3. ユーザーがスワイプ ジェスチャを中止する (逆にするか、右に十分にドラッグしないことにより)
  4. viewWillAppearと呼ばれる
  5. viewDidAppearと呼ばれる

期待を更新し、それに応じてビューのライフサイクル メソッドを更新します。

注目すべきは、ユーザーがポップ ジェスチャを中止した場合でも、すべてのviewWillDisappear場合に呼び出されるという事実です。これは嘘かもしれません。スワイプしてポップするジェスチャが中止された場合、ビューは消えませんよね?

私たち全員と同じようにaddObserver/removeObserver、クラッシュを防ぐためにアプリ内の呼び出しのバランスを取るように努めています。ビュー コントローラーのライフサイクル メソッドをオーバーライドしてハウスキーピングを行い、ビュー コントローラーの有効期間中にオブザーバーが複数回追加されないようにフラグをviewWillAppear/viewWillDisappear維持します。setupPerformedさらに、このトリックを利用して、ビュー コントローラーがナビゲーション コントローラーのスタックから取り出され、その後解放されるかどうかを判断しました。これにより、オブザーバーを破棄するタイミングを正確に知ることができます。

iOS 7 では、このパターンが複雑になりました。viewWillDisappearが呼び出されたときにView Controllerが取り壊されることに頼ることができなくなりました。向きを変えて、「冗談だよ」と叫び、viewWillAppear/viewDidAppearもう一度電話をかけることを期待する必要があります。

于 2013-09-21T01:05:26.697 に答える
6

素晴らしい投稿です!

あなたが言うように、あなたが説明したように と 「トリック」を使用することはできなくなりましたが、代わりに、iOS7で戻るボタンviewWillDisappearをトラップするためにこれがうまく機能します。

- (void)viewDidDisappear:(BOOL)animated
{
  if (self.isMovingFromParentViewController == YES) {
    // Do the tidy up as before....
  }
}

これが誰かに役立つことを願っています。

于 2013-10-03T16:57:51.330 に答える
0

私の状況は少し異なっていました。カスタム navigationController クラスで popViewControllerAnimated をオーバーライドしています。popViewControllerAnimated では、次の場合にドラッグによってポップが発生していることを検出できました。

self.interactivePopGestureRecognizer.state == UIGestureRecognizerStatePossible
于 2015-09-23T21:18:31.797 に答える