ナビゲーションを使っている場合に「戻るボタン」で戻ったことを判定するのにviewWillDisappear
内でisMovingFromParent == true
を使う方法がググると結構出てきます。
※Qiita内だと https://qiita.com/yimajo/items/d9409d83fecf9875061d とか。
が、うまく動作しないパターンをいくつか見つけたので記録しておきます。
検証用Xcodeプロジェクト
検証用に作ったXcodeプロジェクト: https://github.com/pomu0325/isMovingFromParent
- NavigationControllerに以下のViewControllerを埋め込む
- ViewController(背景黒いやつ)
- PushボタンでViewController2を表示
- ViewController2(背景白いやつ)
-
animated: true
のボタンでsetViewControllers([viewController], animated: true)
する -
animated: false
のボタンでsetViewControllers([viewController], animated: false)
する -
viewWillDisappear
内でprint("isMovingFromParent: \(isMovingFromParent)")
して状態を調べる
-
- ViewController(背景黒いやつ)
正しく判定できないケース
以下の操作や処理をすると、viewWillDisappear
のisMovingFromParent
では戻ったかどうかが正しく判定できません。
スワイプで戻ろうとして途中でやめたとき
最近のiOSだと画面左端からのスワイプでナビゲーションの「戻る」ができますが、途中で指を離したり戻したりすると「やっぱやめた」ができます。
が、スワイプを始めたタイミングでviewWillDisappear
が呼ばれ、このタイミングでもisMovingFromParent
はtrue
になっているので「やっぱやめた」場合に「戻る」判定を早まってしまいます。
※ https://qiita.com/yimajo/items/d9409d83fecf9875061d#comment-a08822f1e2081fe33bb0 のコメントでも言及されていました
animated: false
でsetViewControllers
した時
直接ビューのスタックを書き換えたい時に使えるsetViewControllers
をした際に「戻る」操作はしていないので除外したいことがありisMovingFromParent
で判定をしていました。
意外にもanimated
の指定次第でisMovingFromParent
が変わってしまいます。
-
animated: true
の場合:isMovingFromParent == false
になる -
animated: false
の場合:isMovingFromParent == true
になる
ので、誤判定されてしまいます。