ミライスタート TECH系ブログ

株式会社ミライスタートのエンジニア達が気になったTECH系の記事等をアップしています!

NavigationControllerのトップ画面に戻るボタン(<)を表示させる方法

こんにちわ。エンジニアの横田です。
NavigationControllerのトップ画面に戻るボタンを表示させる方法についてです。
本来、トップ画面と言う以上は戻るべきところなどなく、戻るボタンなど表示させることはないはずですが、時としてイレギュラーな画面設計が必要な場合もあります。
UIKitではそんなイレギューラーを実装する分かりやすい方法を提供してくれてはいないみたいですが、少し面倒でもよければやりようが無いわけではありません。今回、その方法をで、ご紹介します。

ストーリーボードの設定
考え方は単純で、本物のトップ画面の前にダミーのトップ画面を置くわけです。そうすることでトップ画面がトップ画面でなくなるわけですから当然戻るボタンが出てきてくれます。
そしてこのダミーのトップ画面に遷移してきた時、画面が表示される前に次の本物のトップ画面へ遷移するようセグエを発火させてやるといいわけです。

プログラムはこのようになります。
DummyTopViewController.swift

class CameraRouteTopViewController: UIViewController {
  var firstAppear = true

override func viewDidLoad() {
     UIView.setAnimationsEnabled(false)
    performSegueWithIdentifier("toRealTop",sender: nil)
}
override func  viewWillAppear(animated: Bool) {
    if !firstAppear {
      //トップ画面の戻るボタンで実行したい処理を記載
    }
    firstAppear = false
 }
}

わざわざトップ画面に戻るボタンを表示させたのだから、そのボタンで何か行いたい処理があるはずです。その処理はダミーのviewWillAppearに書いてやればいいです。最初にダミー画面が呼ばれた時と、その後戻って来た時とで、二回目に呼ばれた時にだけ処理が行われるよう、firstAppearをフラグにして制御を行っています。
それと重要なのは、UIView.setAnimationsEnabled(false)でセグエのアニメーションを無効化にする点です。
これがないとダミーのトップ画面からトップ画面に遷移する際のアニメーションが描画されてしまいます。ダミー画面の存在感を完全に無に帰することが出来なくなってしまうのです。
iOS9以降のみの対応でよければストーリーボードのチェックボックスのみの設定でアニメーションの無効化も出来るようです。ただ、8以前にも対応しようとすると、それでは未対応なのでプログラムからのアニメーションを無効にしました。

そして遷移先のトップ画面で、アニメーションを有効化します。
RealTopViewController.swift

class RealTopViewController: UIViewController {
override func viewDidLoad() {
     UIView.setAnimationsEnabled(true)
    //その他画面描画に必要な処理があれば記載
}
}