我正在学习在Objective C中编写一个简单的Web浏览器Mac应用程序。我有一个简单的文本字段作为地址栏和Webview。因此,当我点击链接时,每当页面发生变化时,我希望在文本字段中更新网站的地址。
谷歌搜索后,我意识到我可以使用方法
didStartProvisionalLoadForFrame
WebFrameLoadDelegate协议中的。然后我继续输入
@interface AppDelegate : NSObject <NSApplicationDelegate,WebFrameLoadDelegate>
导致错误。经过进一步搜索后,我发现这是由于WebFrameLoadDelegate是一个非正式的协议。
我的问题是:使用非正式协议指定的方法的语法是什么?
- (void)webView:(WebView *)webView didFinishLoadForFrame:(WebFrame*)frame;
答案 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地址。