この時点で、かなり単純な iOS 5 アプリができました。
UINavigationController は、Interface Builder の初期ビュー コントローラーとして設定されます (今でも Interface Builder と呼びますか?とにかく...)。UINavigationController には、その rootViewController として汎用の UITabBarController があります。
UINavigationController と UITabBarController デリゲートの両方にメインの AppDelegate を使用したいと考えています。AppDelegate を UINavigationControllerDelegate と UITabBarControllerDelegate の両方に準拠させました。すべてがうまく機能します。しかし!
AppDelegate の application:didFinishLaunchingWithOptions: では、何かハックなことをしているような気がします。各コントローラーデリゲートを設定するために、self.window.rootViewController と self.window.rootViewController.topViewController を型キャストする必要があります。
UINavigationController *rootNavigationController = (UINavigationController *) self.window.rootViewController;
UITabBarController *rootTabBarController = (UITabBarController *) rootNavigationController.topViewController;
[rootNavigationController setDelegate:self];
[rootTabBarController setDelegate:self];
self.window.rootViewController を型キャストしないと、デリゲートを設定できません。topViewController (UITabBarController) についても同様です。
Inferface Builder で初期ビューが UINavigationController であり、一般的な UIViewController ではないことを宣言した場合、なぜすべてを型キャストしなければならないのでしょうか? これはハッキーですか?