3

私はObjectiveCでシンプルなWebブラウザMacアプリをプログラムすることを学んでいます。アドレスバーとWebビューとしてシンプルなテキストフィールドがあります。そのため、リンクをクリックしたときにページが変更されるたびに、テキストフィールドのWebサイトのアドレスを更新したいと思います。

グーグルした後、私は方法を使用できることに気付きました

    didStartProvisionalLoadForFrame

WebFrameLoadDelegateプロトコルで。次に入力します

@interface AppDelegate : NSObject <NSApplicationDelegate,WebFrameLoadDelegate>

エラーが発生しました。さらに検索したところ、WebFrameLoadDelegateが非公式のプロトコルであることが原因であることがわかりました。

私の質問はこれです:非公式プロトコルによって指定された以下の方法を使用するための構文は何ですか?

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

2 に答える 2

4

非公式のプロトコルでは、プロトコルへの準拠を宣言せずにメソッドを実装します。WebFrameLoadDelegateタイプではなく、NSObjectカテゴリの名前です。

以前は、プロトコルのメソッドがオプションであることを指定する方法がなかったために存在します(@optionalおよび@requiredキーワードは存在しませんでした)。必要なキーワードがObjective-Cに追加されると、Appleはオプションのメソッドを使用する正式なプロトコルに移行し始めました。これにより、型の安全性と自己文書化コードが向上します。

于 2012-10-07T02:52:03.593 に答える
3

Webビューを手動で作成する場合は、次のように独自のクラスをデリゲートとして設定するだけ[webview setDelegate:self]です。ただし、代わりにIBでWebビューを作成した場合は、代わりにそこにデリゲートをリンクできます。

クラスをWebビューのデリゲートとして設定すると、追加のコードなしでそのメソッドを実装できます。

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

また、WebViewは、フレームのロードが完了するたびにメソッドを呼び出すだけです。

これがどのように機能するかを知りたい場合は、すべてデリゲートの構築に戻ります。WebViewは、デリゲートがnilであるかどうかをチェックします。respondsToSelector:そうでない場合は、デリゲートがデリゲートメソッドを実装しているかどうかを確認するために呼び出します。非公式のデリゲートは、オプションのプロトコルメソッドを許可する古い方法であり、@JonathanGrynspanが述べているようにもう使用しないでください。

また、知らなかった場合は、IBで接続する場合、クラスがプロトコルを確認することを明示的に宣言する必要はありません(非公式でなくても)。

ちなみに、Webビューで作業している場合は、Appleの開発ガイドを確認してください。WebビューのURLアドレスをいつ変更するかなど、Webビューの基本を作成するためのステップバイステップのチュートリアルを提供します。

于 2012-10-07T03:08:09.290 に答える