向 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&lt;UIApplicationDelegate&gt;。如果您想抑制警告,您需要从您知道应用程序委托的完整类型的某个地方分配positioningNetworkingDelegate。 (例如,如果您在代理自己的代码中,您可以只说 positioningBrain.positioningNetworkingDelegate = self 就可以了)。

您也可以强制转换以使编译器相信这是有效的:

self.positioningBrain.positioningNetworkingDelegate = (ProgramAppDelegate *)[UIApplication sharedApplication].delegate;

许多人为此目的制作了快捷功能或宏。比如:

#define APPDEL ((ProgramAppDelegate *)[UIApplication sharedApplication].delegate)

【讨论】:

以上是关于向 AppDelegate 添加协议未注册的主要内容,如果未能解决你的问题,请参考以下文章

AppDelegate 未提供 UIViewController

应用程序未注册移动安装

AppDelegate Swift 中的选项卡式应用程序和核心数据函数

从 AppDelegate 向 ViewController 上的属性添加值

Swift - 从AppDelegate向View Controller添加子视图

向 Cordova AppDelegate iOS 添加额外的委托