まず、Appleのドキュメントに記載されているように、タブバーはルートレベルにある必要があります。つまり、ウィンドウに追加されている必要があります。これは正しい動作の鍵です。
次に、/を使用して通知を手動で転送できますが、ビュー呼び出しの階層全体を正しく機能させるには、手動で呼び出すだけで済みます。UITabBarDelegate
UINavigationBarDelegate
[tabBarController viewWillAppear:NO];
[tabBarController viewDidAppear:NO];
と
[navBarController viewWillAppear:NO];
[navBarController viewDidAppear:NO];
..それぞれのコントローラーにビューコントローラーを設定する前に1回だけ(割り当て直後)。それ以降、子ViewControllerでこれらのメソッドを正しく呼び出しました。
私の階層は次のようになります。
window
UITabBarController (subclass of)
UIViewController (subclass of) // <-- manually calls [navController viewWill/DidAppear
UINavigationController (subclass of)
UIViewController (subclass of) // <-- still receives viewWill/Did..etc all the way down from a tab switch at the top of the chain without needing to use ANY delegate methods
tab / navコントローラーで前述のメソッドを初めて呼び出すだけで、すべてのイベントが正しく転送されることが保証されました。UINavigationBarDelegate
/UITabBarControllerDelegate
メソッドから手動で呼び出す必要がなくなりました。
補足:不思議なことに、それが機能しなかったとき、プライベートメソッド
- (void)transitionFromViewController:(UIViewController*)aFromViewController toViewController:(UIViewController*)aToViewController
..動作中の実装のコールスタックからわかるように、通常はviewWill/Did..
メソッドを呼び出しますが、上記を実行するまで呼び出しませんでした(呼び出された場合でも)。
UITabBarController
ただし、がウィンドウレベルであり、ドキュメントがこれをバックアップしているように見えることが非常に重要だと思います。
それが明確であり、さらなる質問に喜んで答えることを願っています。