髪も切れるiOSエンジニアのブログ

元美容師エンジニアの成長と奮闘の記録

自作家計簿アプリ製作の軌跡③ 〜NavigationControllerの実装〜

今回はNavigationControllerの実装です。
アプリの仕様的に階層の深い作りにする気はないので
NavigationBarをStoryBoardで取り入れればいいかとも思いましたが、
将来的なバージョンアップで画面数の増加も考えてNavigationControllerを取り入れました。
でも、実装している中で大きな誤解に気づいたので記事にします。

環境

xcode 8.1
swift 3

実装

前提として、自分の家計簿アプリはトップ画面にTabBarを置いた作りです。
なんとなくNavigationControllerってStoryBoardで言うところの
遷移の一番初めの親のViewに置くイメージが強かったので
f:id:Tansok:20161126235620p:plain
迷わずこうした訳です。
NavigationControllerのrootViewControllerにTabBarControllerを設定してます。
実機でデバッグしてみても全画面にNavigationBarが設置されており
「よしっ」なんて思いましたが、落とし穴がありました。
それぞれのViewControllerの「title」を設定してみてもNavigationBarに
表示されません!なんでだ?!
そこで素直に先人の知恵を求めてみました。
あったあった。
TabBarControllerとNavigationControllerを同時に使う(Storyboard) - Qiita
tabBarControllerとUINavigationControllerを同時に使いたい! - Takahiro Octopress Blog
要するに、階層構造にしたい親のViewに設定しなければいけないってこと。
NavigationControllerのrootViewController以下の遷移は「push」か「show」結ばれていなければならないってこと。
自分のアプリのトップ画面はTabBarControllerで、その子は「viewControllers」で3画面持っている状態です。
なんか理科の電流の授業を思い出しましたけど、並列繋ぎではNavigationControllerは機能しないんですね。
f:id:Tansok:20161127001336p:plain
結論はこう。
TabBarから分岐した遷移の配下からNavigationControllerを置きましょう。

おまけ

ちなみにNavigationControllerが複数になったとしても
AppDelegateクラスのdidFinishLaunchingWithOptions内で

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
        
        // ナビゲーションバーのカラー設定
        UINavigationBar.appearance().barTintColor = UIColor.orange()
        // ナビゲーションバーのフォント設定(フォント名、サイズ)
        let attributes =
            [NSForegroundColorAttributeName:UIColor.white,
             NSFontAttributeName: UIFont(name:"Futura", size:25)!]
        UINavigationBar.appearance().titleTextAttributes = attributes
        // タブバーのカラー設定
        UITabBar.appearance().barTintColor = UIColor.orange()
        
        return true
    }

appearance()メソッドを使えば全画面NavigationBarを一括で変更、統一できます。

つづく