2012-08-08 46 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)