setDelegate 上的语义问题

Posted

技术标签:

【中文标题】setDelegate 上的语义问题【英文标题】:Semantic Issue on setDelegate 【发布时间】:2013-05-26 21:30:38 【问题描述】:

我的代码存在语义问题。我有一个 UIWebView,我添加了一条错误消息,所以如果没有互联网连接,则会弹出一个错误。

这是我的 .m 文件中 UIWebView 的编码

- (void)viewDidLoad 
[super viewDidLoad];
NSString *fullURL = @"http://example.com";
NSURL *url = [NSURL URLWithString:fullURL];
NSURLRequest *requestObj = [NSURLRequest requestWithURL:url];
[website setDelegate:self];
[website loadRequest:requestObj]; 

错误在此代码上

[website setDelegate:self];

它说这是一个语义问题,错误是 Sending FirstViewController *const_strong to parameter of in compatible type id

如果没有互联网连接,这是错误消息的代码

- (void)webView:(UIWebView *)webView didFailLoadWithError:(NSError *)error 
[[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:NO];

UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"error" message:@"error connecting to the internet" delegate:self
cancelButtonTitle:@"Ok" otherButtonTitles:nil, nil];
[alert show]; 

【问题讨论】:

【参考方案1】:

您需要指定 FirstViewController 实现协议。比如:

@interface FirstViewController ()  <UIWebViewDelegate>
@end

编译器当前警告您,您正在设置一个委托,该委托未指定它实现所需的协议,因此不会执行编译检查。

【讨论】:

【参考方案2】:

您的视图控制器应通过在@interface 行的末尾添加“&lt;UIWebViewDelegate&gt;”来指定它符合UIWebViewDelegate,或者在.h 的主要@interface 声明中:

@interface MyViewController : UIViewController <UIWebViewDelegate>

.m 文件中的私有类扩展(如果有的话):

@interface MyViewController () <UIWebViewDelegate>

请参阅Objective-C 编程指南中的Conforming to Protocols。

【讨论】:

以上是关于setDelegate 上的语义问题的主要内容,如果未能解决你的问题,请参考以下文章

在 Interface Builder 中设置委托与使用 setDelegate: 有啥区别?

iPhone setDelegate 到先前分配的对象

setDelegate 到我的自定义视图控制器落下无法识别的选择器

如何忽略 Qt Creator 上的语义问题

HTML 页面选项卡上的语义

页面选项卡上的语义