3

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

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

    didStartProvisionalLoadForFrame

在 WebFrameLoadDelegate 协议中。然后我继续输入

@interface AppDelegate : NSObject <NSApplicationDelegate,WebFrameLoadDelegate>

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

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

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

2 回答 2

4

使用非正式协议,您无需声明符合协议即可实现方法。WebFrameLoadDelegate不是类型,只是NSObject类别的名称。

它们之所以存在,是因为以前无法​​指定协议中的方法是可选的(@optionaland@required关键字不存在。)当必要的关键字被添加到 Objective-C 时,Apple 开始转向带有可选方法的正式协议,这使得更好的类型安全和自我记录的代码。

于 2012-10-07T02:52:03.593 回答
3

如果您手动创建 webview,那么只需将您自己的类设置为委托,如下所示[webview setDelegate:self]。但是,如果您改为在 IB 中创建 webview,则可以将委托链接到那里。

一旦您将您的类设置为 webview 的委托,您就可以实现该方法而无需任何额外的代码。

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

WebView 将在完成加载帧时简单地调用您的方法。

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

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

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

于 2012-10-07T03:08:09.290 回答