2

最初のビューがロケーション コントローラー呼び出し-(void)locationFoundをそのデリゲート[UIApplication sharedApplication].delegate(AppDelegate) にロードするとすぐに、必要なメソッド locationFound を 1 つだけ要求する対応するプロトコルがあります。

AppDelegate ヘッダーで次のように宣言されたプロトコルの遵守があります。

@interface ProgramAppDelegate : UIResponder <UIApplicationDelegate, LocationFoundProtocol>

すべて正常に動作します - - ロケーション コントローラーでデリゲートを割り当てるときに警告が表示されることを除いて - 次のように:

self.positioningBrain.positioningNetworkingDelegate = [UIApplication sharedApplication].delegate;

それは私に言います:

Assigning to 'id<LocationFoundProtocol>' from incompatible type 'id<UIApplicationDelegate>'

ヘッダーで宣言されているにもかかわらず、AppDelegate が指定したプロトコルに実際に準拠していることを認識していないようです。

XCode がこの不一致を登録する理由はありますか? とにかくプロトコルはすべてセマンティクスでなければならないので、コードが機能することにあまり驚かないのですが、それを行うためのより良い方法があれば知りたいです。

4

2 に答える 2

3

UIapplication のデリゲート プロパティは次の型を返します

id<UIApplicationDelegate>

返された型を AppDelegates 型にキャストする必要があります

... = (MyAppDelegate*)[UIApplication sharedApplication].delegate
于 2012-08-08T20:58:29.123 に答える
1

[UIApplication sharedApplication].delegate問題は、コンパイラがそれがタイプであることを認識していないことProgramAppDelegateです。わかっているのは、UIApplication のデリゲート メソッドが を返すことだけid<UIApplicationDelegate>です。警告を抑制したい場合positioningNetworkingDelegateは、アプリケーション デリゲートの完全な型を知っている場所から割り当てる必要があります。(たとえば、デリゲート自身のコードを使用している場合は、次のように言うだけでpositioningBrain.positioningNetworkingDelegate = self機能します)。

これをキャストして、これが有効であることをコンパイラに納得させることもできます。

self.positioningBrain.positioningNetworkingDelegate = (ProgramAppDelegate *)[UIApplication sharedApplication].delegate;

多くの人が、この目的のためにショートカット関数またはマクロを作成します。何かのようなもの:

#define APPDEL ((ProgramAppDelegate *)[UIApplication sharedApplication].delegate)
于 2012-08-08T20:58:40.320 に答える