向 AppDelegate 添加协议未注册
Posted
技术标签:
【中文标题】向 AppDelegate 添加协议未注册【英文标题】:Added protocol to AppDelegate not registering 【发布时间】:2012-08-08 20:52:57 【问题描述】:一旦我的第一个视图加载我的位置控制器调用-(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 注册这种不匹配是否有某些原因?我对我的代码可以正常工作并不感到惊讶,因为无论如何协议都应该是语义的,但是如果有更好的方法可以做到这一点,我想知道。
【问题讨论】:
只是确定一下——您是否将“#import "ProgramAppDelegate.h"
”放在了您尝试执行该任务的顶部?
你必须投 [UIApplication sharedApplication].delegate
, developer.apple.com/library/ios/DOCUMENTATION/UIKit/Reference/…
【参考方案1】:
UIapplication的delegate属性返回如下类型
id<UIApplicationDelegate>
您必须将返回的类型转换为您的 AppDelegates 类型
... = (MyAppDelegate*)[UIApplication sharedApplication].delegate
【讨论】:
self.positioningBrain.positioningNetworkingDelegate = (ProgramAppDelegate*)[UIApplication sharedApplication].delegate;不起作用 - 出于某种原因,它告诉我它找不到 ProgramAppDelegate* - 即使那是我正在工作的类。使用未声明的标识符“LocalChatAppDelegate”预期的表达式在消息发送表达式的开头缺少“[”应为“]” 您必须将#import "LocalChatAppDelegate.h" 添加到您使用投射的文件顶部。 请记住,您使用的所有类型都必须使用 #import "whatever.h" 导入,编译器才能在实现中看到它们 糟糕,甚至不在 AppDelegate 中。只是铁杆derping。 Shift输入也谢谢。谢谢。 强制转换本身不需要导入标头(前向声明就可以了)。导入标头对于它知道该类实现了该协议是必要的,因此它不会生成警告。【参考方案2】:问题是编译器不知道[UIApplication sharedApplication].delegate
的类型是ProgramAppDelegate
;它只知道 UIApplication 的委托方法返回id<UIApplicationDelegate>
。如果您想抑制警告,您需要从您知道应用程序委托的完整类型的某个地方分配positioningNetworkingDelegate
。 (例如,如果您在代理自己的代码中,您可以只说 positioningBrain.positioningNetworkingDelegate = self
就可以了)。
您也可以强制转换以使编译器相信这是有效的:
self.positioningBrain.positioningNetworkingDelegate = (ProgramAppDelegate *)[UIApplication sharedApplication].delegate;
许多人为此目的制作了快捷功能或宏。比如:
#define APPDEL ((ProgramAppDelegate *)[UIApplication sharedApplication].delegate)
【讨论】:
以上是关于向 AppDelegate 添加协议未注册的主要内容,如果未能解决你的问题,请参考以下文章
AppDelegate 未提供 UIViewController
AppDelegate Swift 中的选项卡式应用程序和核心数据函数
从 AppDelegate 向 ViewController 上的属性添加值