まず、アップルのドキュメントに記載されているように、タブバーはルートレベルにある、つまりウィンドウに追加されている必要があります。これが正しい動作の鍵です。
次に、/ を使用して通知を手動で転送できますが、ビュー呼び出しの階層全体を正しく機能させるには、手動で呼び出すだけでよいことがわかりましたUITabBarDelegate
UINavigationBarDelegate
[tabBarController viewWillAppear:NO];
[tabBarController viewDidAppear:NO];
そして
[navBarController viewWillAppear:NO];
[navBarController viewDidAppear:NO];
..それぞれのコントローラーでビューコントローラーを設定する前に(割り当て直後に)一度だけ。それ以降、子ビューコントローラでこれらのメソッドを正しく呼び出しました。
私の階層は次のとおりです:
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
タブ/ナビゲーションコントローラーで前述のメソッドを初めて呼び出すだけで、すべてのイベントが正しく転送されることが保証されました。UINavigationBarDelegate
/ UITabBarControllerDelegate
メソッドから手動で呼び出す必要がなくなりました。
傍注:不思議なことに、それが機能しなかった場合、プライベートメソッド
- (void)transitionFromViewController:(UIViewController*)aFromViewController toViewController:(UIViewController*)aToViewController
..機能している実装のコールスタックから確認できますが、通常はviewWill/Did..
メソッドを呼び出しますが、(呼び出された場合でも)上記を実行するまではそうではありませんでした。
UITabBarController
ウィンドウレベルであることが非常に重要であり、ドキュメントはこれを裏付けているようです。
それが明確であるように願って、さらなる質問に答えて幸せです。