添加协议到AppDelegate没有注册

时间:2012-08-08 20:52:57

标签: objective-c cocoa-touch protocols delegation appdelegate

只要我的第一个视图加载我的位置控制器就会调用-(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会记录这种不匹配的原因?我对代码的工作并不感到惊讶,因为协议无论如何都应该是语义,但如果有更好的方法,我想知道。

2 个答案:

答案 0 :(得分:3)

UIapplication的delegate属性返回以下类型

id<UIApplicationDelegate>

您必须将返回的类型强制转换为AppDelegates类型

... = (MyAppDelegate*)[UIApplication sharedApplication].delegate

答案 1 :(得分: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)