UINavigationController と UITabBarController

UINavigationController と UITabBarController を同時に使う方法は以前解決したつもり。開発を進めていると、ボタンを選択し + ボタンを押しても別のデータが追加されてしまう。ボタンを押したら、初回はいいのですが色々画面を切り替えていると問題が起こるようで、navigationController が 切り替わっていない。

現象を把握するのにすごい時間がかかってしまった。タブバーのボタンを押したら初回は 最前面の view が表示されるタイミングで viewDidLoad が呼ばれる。でも、2回目ボタンを押したら呼ばれない。すでにメモリにロードされているから。これが問題で、各 viewController では、viewDidLoad method では navigationController の初期化を行なっているので、呼んでくれないと、前の navigationController が残ってしまっているので、画面に応じた適切な navigation が表示されないということ。

解消するために、navigationController に対応する m と h を作り、delegate では、self.delegate = self という、謎の delegate を宣言し、delegate method である 

-(void)tabBarController:(UITabBarController*)tabBarController
didSelectViewController:(UIViewController*)viewController

にて、[viewController vieDidLoad]; と、強制的に選択されたら viewDidLoad を呼ぶようにするとうまくいった。

delegate の使い方として自身を指定することから、なんとも珍妙な形なので、あとで修正することにしよう。

結局、テンプレートで navigationController を選択しているので、AppDelegate に tabBarController が書かれておらず、自分で書かないとダメなのだと。

と、原因がわかればすんなりなのですが、わかるまでが大変で、1 週間ぐらい悩んでしまいました。