2012-05-08 8 views
0

私はこの時点でかなり簡単なiOS 5アプリを持っています。iOSアプリケーションデリゲートでwindow.rootViewControllerの型キャストが必要なのはなぜですか?

UINavigationControllerは、Interface Builderの初期View Controllerとして設定されています(とにかく、Interface Builderとも呼ばれますが...)。 UINavigationControllerは、そのrootViewControllerとして汎用のUITabBarControllerを持っています。

UINavigationControllerとUITabBarControllerの両方のデリゲートのAppDelegateを使いたいと思います。 AppDelegateをUINavigationControllerDelegateとUITabBarControllerDelegateの両方に準拠させました。すべてがうまくいく。しかし!

AppDelegateのアプリケーションで:didFinishLaunchingWithOptions:、私は何かハッキーをしているように感じる。私はself.window.rootViewControllerとself.window.rootViewController.topViewControllerを型変換して各コントローラの代理人を設定する必要があります。

私がタイプキャストしていない場合は、self.window.rootViewController私は代理人を設定できません。 topViewController(UITabBarController)と同じです。

Inferface Builderで初期ビューがUINavigationControllerであり、一般的なUIViewControllerではないと宣言した場合、どうして私はまだ型キャストする必要がありますか?これはハッキーでしょうか?

window.rootViewController 

プロパティを呼び出す

+1

'[self.window.rootViewController setDelegate:self]'を試したときに何を得ましたか? – dasblinkenlight

+0

"'UIViewController'の表示されない@interfaceはセレクタsetDelegateを宣言します。"それはコンパイルされません。 –

答えて

3

UIViewControllerのインスタンスを返し、そしてそのクラスはdelegate呼ば公に可視性を持っていません。しかし、UINavigationControllerがあります。

プロパティシンタックス(ドット表記法)を使用する場合、コンパイラは受信者のクラスが宣言したプロパティを知る必要があります。

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

しかし、一般的に明示的には良いです。コンパイラはメッセージを正しく/安全に-setDelegate:UIViewControllerに送信する方法を知らないため、それが文句を言う理由です。あなたはそれをもっと明白にする必要があります。

+0

ええ、興味深いですが、私は、「初期ビューコントローラ」がInterfaceBuilderのUINavigationControllerであることを明示的に宣言しています。この宣言はself.window.rootViewControllerとは関係ありませんか? –

+1

いいえ、間違いなく*関連しています。 iOS 5のストーリーボードでは、最初のView ControllerはUIWindowのインスタンスで 'rootViewController'になります。 –

1

ことを覚えておいて、あなたがself.window.rootViewController呼び出すときに、実際にそれがのUIViewControllerオブジェクトを返すメソッドです

[self.window rootViewController]; 

を呼んでいます。 、UIWindowクラスで宣言されたrootViewControllerプロパティがクラスUIViewControllerに属しています。

UIWindowオブジェクトは、プロパティを設定すると、実際に型キャストはすでにここに起こっている

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

を呼び出しているので、そのrootViewControllerプロパティは、所属しているクラスか分からないでしょう。ランタイムはこのメソッドを使用して、xibで宣言したアウトレットリンクを実装します。

だから、型変換を再実行するしかありません。 と同じケースrootNavigationController.topViewController

関連する問題