iOS
Swift

InterfaceBuilderを利用せずにカスタムNavigationItemクラスを適用する

方法はとても簡単でViewControllerのnavigationItemをoverrideすれば良い。

class SampleViewController: UIViewController {
    override var navigationItem: NavigationItem {
        return CustomNavigationItem()
    }
}

UINavigationBarは画面のpush遷移時に遷移先ViewControllerに定義してあるnavigationItemを自身の管理するitemsプロパティに挿入するような仕組みになっている。

なので、ViewControllerに定義してあるnavigationItemは直接呼び出しても、それは今画面に出ているNavigationItemとは別物です。
(set onlyで定義してある時点でわかるとは思いますが。。。)

仕組みさえ覚えれば簡単なのですが、UINavigationBarがsetItemspushItemというトラップを提供しており1、ドキュメント読み込まない人お断り的雰囲気に若干の辛さを覚えるのでした。


  1. これはUINavigationBarをUINavigationController以外のコンテキストで利用する場合に使える機能で、UINavigationController上で利用する場合アプリがクラッシュします。