2012-08-08 72 views
2

作为我的第一视图加载我的位置控制器调用-(void)locationFound其代表,这是[UIApplication sharedApplication].delegate(我的AppDelegate) 我有只是要求对于一个要求的方法locationFound相应的协议很快。添加协议的appDelegate不登记

我必须声明,像这样在我的AppDelegate头的协议坚持:

@interface ProgramAppDelegate : UIResponder <UIApplicationDelegate, LocationFoundProtocol> 

一切工作正常 - - 除了我得到一个警告,当我在我的位置控制器指定的委托 - 就像这样:

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

它告诉我:

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

好像它根本不看日在我的AppDelegate事实上符合我指定的协议 - 即使它是在头文件中声明的。

XCode注册这种不匹配有什么原因吗?我对代码的工作原理并不感到惊讶,因为无论如何协议都应该是语义的,但是如果有更好的方法可以做到这一点,我想知道。

+0

只是确定 - 你是否在任何你想要做这项任务的地方,都会有''#import“ProgramAppDelegate.h”'“? – 2012-08-08 20:58:29

+0

你要投'[UIApplication的sharedApplication] .delegate',http://developer.apple.com/library/ios/DOCUMENTATION/UIKit/Reference/UIApplication_Class/Reference/Reference.html#//apple_ref/doc/uid/ TP40006728-CH3-SW24 – Vervious 2012-08-08 20:58:45

回答

3

的UIApplication的委托属性返回以下类型

id<UIApplicationDelegate> 

必须转换返回类型为您AppDelegates键入

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

self.positioningBrain.positioningNetworkingDelegate =(ProgramAppDelegate *)[UIApplication sharedApplication] .delegate;不工作 - 由于某种原因,它告诉我它无法找到ProgramAppDelegate * - 尽管这是我在使用未声明的标识符的“LocalChatAppDelegate” 预计表达工作类 失踪“[”的消息的开始。发送表情 预计']' – 2012-08-08 21:28:16

+0

呃,你怎么打进!! – 2012-08-08 21:31:29

+0

发表评论? shift - 输入 – 2012-08-08 21:34:52

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)