iOS 7 の新しいスワイプ トゥ ポップ ジェスチャは、View Controller のライフサイクルにどのような影響を与えますUINavigationController
か?
3 に答える
iOS 7 の新機能は、スワイプしてポップするジェスチャUINavigationController
です。指を左から右にスワイプして、通常戻るボタンで行うことを行うことができます。注意しなければならないのは、ポップ遷移がキャンセル可能であることです。
戻るボタンをタップしても、期待どおりに機能します。
- ユーザーが戻るボタンをタップ
viewWillDisappear
と呼ばれるviewDidDisappear
と呼ばれる- ポップされたコントローラーがリリースされます
スワイプ トゥ ポップの完了は、戻るボタンをタップするようなものです
- ユーザーが左から右にスワイプし始める
viewWillDisappear
と呼ばれる- ユーザーがスワイプ ジェスチャを完了する
viewDidDisappear
と呼ばれる- ポップされたコントローラーがリリースされます
キャンセルされたスワイプ トゥ ポップは次のように機能します
- ユーザーが左から右にスワイプし始める
viewWillDisappear
と呼ばれる- ユーザーがスワイプ ジェスチャを中止する (逆にするか、右に十分にドラッグしないことにより)
viewWillAppear
と呼ばれるviewDidAppear
と呼ばれる
期待を更新し、それに応じてビューのライフサイクル メソッドを更新します。
注目すべきは、ユーザーがポップ ジェスチャを中止した場合でも、すべてのviewWillDisappear
場合に呼び出されるという事実です。これは嘘かもしれません。スワイプしてポップするジェスチャが中止された場合、ビューは消えませんよね?
私たち全員と同じようにaddObserver/removeObserver
、クラッシュを防ぐためにアプリ内の呼び出しのバランスを取るように努めています。ビュー コントローラーのライフサイクル メソッドをオーバーライドしてハウスキーピングを行い、ビュー コントローラーの有効期間中にオブザーバーが複数回追加されないようにフラグをviewWillAppear/viewWillDisappear
維持します。setupPerformed
さらに、このトリックを利用して、ビュー コントローラーがナビゲーション コントローラーのスタックから取り出され、その後解放されるかどうかを判断しました。これにより、オブザーバーを破棄するタイミングを正確に知ることができます。
iOS 7 では、このパターンが複雑になりました。viewWillDisappear
が呼び出されたときにView Controllerが取り壊されることに頼ることができなくなりました。向きを変えて、「冗談だよ」と叫び、viewWillAppear/viewDidAppear
もう一度電話をかけることを期待する必要があります。
素晴らしい投稿です!
あなたが言うように、あなたが説明したように と 「トリック」を使用することはできなくなりましたが、代わりに、iOS7で戻るボタンviewWillDisappear
をトラップするためにこれがうまく機能します。
- (void)viewDidDisappear:(BOOL)animated
{
if (self.isMovingFromParentViewController == YES) {
// Do the tidy up as before....
}
}
これが誰かに役立つことを願っています。
私の状況は少し異なっていました。カスタム navigationController クラスで popViewControllerAnimated をオーバーライドしています。popViewControllerAnimated では、次の場合にドラッグによってポップが発生していることを検出できました。
self.interactivePopGestureRecognizer.state == UIGestureRecognizerStatePossible