2

一旦我的第一个视图加载我的位置控制器调用-(void)locationFound到它的委托,即[UIApplication sharedApplication].delegate(我的 AppDelegate),我就有一个相应的协议,它只要求一个所需的方法 locationFound。

我在我的 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是 type 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 回答