0

この時点で、かなり単純な 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 ではないことを宣言した場合、なぜすべてを型キャストしなければならないのでしょうか? これはハッキーですか?

4

2 に答える 2

3

プロパティの呼び出し

window.rootViewController

は のインスタンスを返しますがUIViewController、そのクラスには と呼ばれるパブリックに表示されるプロパティがありませんdelegateUINavigationControllerただし、そうです。

プロパティ構文 (つまり、ドット表記) を使用する場合、コンパイラは、レシーバのクラスが宣言したプロパティを知る必要があります。

代わりに標準のメッセージ表記を行い、キャストしない場合[rootViewController setDelegate:self]、おそらく になりworkますが、それでもコンパイラの警告が表示されると思いますが、「機能します」。

しかし、一般的には、明示的であることは良いことです。-setDelegate:コンパイラは、メッセージを適切/安全に に送信する方法を認識していないため、エラーが発生しますUIViewController。あなたはそれをもっと明確にする必要があります。

于 2012-05-08T03:52:54.780 に答える
1

self.window.rootViewController電話をかけるときは、実際に電話していることに注意してください

[self.window rootViewController];

UIViewController オブジェクトを返すメソッドです。UIWindow クラスで宣言された rootViewController プロパティは Class に属しUIViewControllerます。

UIWindow オブジェクトは、その rootViewController プロパティがどのクラスに属しているかを知りません。

[self.window setRootViewController:(UIViewController *) aViewController];

タイプキャストはすでにここで行われています。また、ランタイムはこのメソッドを使用して、xib で宣言したアウトレット リンクを実装します。

したがって、再タイプキャストするしか方法はありません。と同じケースrootNavigationController.topViewController

于 2012-05-08T04:23:58.550 に答える