如何在Objective C中使用非正式协议中的方法

时间:2012-10-07 02:42:23

标签: objective-c macos protocols

我正在学习在Objective C中编写一个简单的Web浏览器Mac应用程序。我有一个简单的文本字段作为地址栏和Webview。因此,当我点击链接时,每当页面发生变化时,我希望在文本字段中更新网站的地址。

谷歌搜索后,我意识到我可以使用方法

    didStartProvisionalLoadForFrame
WebFrameLoadDelegate协议中的

。然后我继续输入

@interface AppDelegate : NSObject <NSApplicationDelegate,WebFrameLoadDelegate>

导致错误。经过进一步搜索后,我发现这是由于WebFrameLoadDelegate是一个非正式的协议。

我的问题是:使用非正式协议指定的方法的语法是什么?

- (void)webView:(WebView *)webView didFinishLoadForFrame:(WebFrame*)frame;

2 个答案:

答案 0 :(得分:4)

使用非正式协议,您可以在不声明对协议的符合的情况下实现这些方法。 WebFrameLoadDelegate不是类型,只是NSObject类别的名称。

它们的存在是因为以前没有办法指定协议中的方法是可选的(@optional@required关键字不存在。)当必需的关键字添加到Objective时-C,Apple开始使用可选方法转向正式协议,这样可以提高类型安全性和自我记录代码。

答案 1 :(得分:3)

如果您手动创建了一个webview,那么只需将您自己的类设置为代理,如下面的[webview setDelegate:self]。但是如果您在IB中创建了webview,则可以将代理链接到那里。

http://f.cl.ly/items/431J3W033E231x3i3e3D/Screen%20Shot%202012-10-07%20at%2011.03.08%20AM.png

将您的类设置为webview的委托后,您可以在没有任何额外代码的情况下实现该方法。

- (void)webView:(WebView *)webView didFinishLoadForFrame:(WebFrame*)frame
{
    //Do stuff here.
}

只要WebView完成加载框架,它就会调用你的方法。

如果你想知道它是如何工作的,那一切都可以追溯到委托的构建。 WebView将检查委托是否为零。如果不是,那么它将调用respondsToSelector:来检查委托是否已实现委托方法。非正式代表只是一种允许可选协议方法的旧方法,不应再使用@JonathanGrynspan

所述的方法

如果您不知道,如果您在IB中连接它,则不必明确声明您的班级确认协议(即使它不是非正式的)。

顺便说一下,如果你正在开发一个webview,请查看Apple的development guide。它为您提供了有关创建webview基础知识的分步教程,包括何时更改webview的URL地址。