URL とタイトルを設定する

URL とタイトルを設定する

続いて、ブラウザに現在のURL とタイトルを設定してみよう。前の段階では、ク リックして他のページに行っても、テキストフィールドのURL が変わらなかった。も ちろん、ウィンドウのタイトルも変わらなかった。これらを設定するには、 WebFrameLoadDelegate というものを使う。

5.1 WebFrameLoadDelegate


WebFrameLoadDelegate とは、WebFrame がデータを読み込むときのデリゲー トだ。ちなみに、デリゲートを簡単に説明すると、WebFrame で何らかのイベントが 起きたときに、登録しているオブジェクトに通知してくれる仕組みだ。フレームにデー タを読み込むときは、次のような順序でWebFrameLoadDelegate のメソッドが呼び出されるんだ。

1. webView:didStartProvisionalLoadForFrame:
読み込みの処理を始めるときに呼び出されるんだ。

2. webView:willCloseFrame:
新しいページを読み込むには、古いフレームが閉じられるんだ。その古い WebFrame が解放するときに呼び出される。引数として、古い方のWebFrame を取るよ。

3. webView:didCommitLoadForFrame:
実際に読み込みの処理がスタートするときに呼び出されるんだ。

4. webView:didReceiveTitle:forFrame:
データを読み込んでいる最中に、ページのタイトルが見つかったら呼び出されるんだ。

5. webView:didFinishLoadForFrame:
読み込みが終わったときに呼び出されるんだ。

これから読み込むURL は、1. のwebView:didStartProvisionalLoadFrame: の時点で分かる。ページのタイトルは4. の webView:didReceiveTitle:forFrame: で分かるんだ。だから、フレームにデリ ゲートを設定してやって、1. と4. の時点で設定してやればいい。


5.2 WebFrameLoadDelegate を設定する

デリゲートを設定するには、WebView のメソッドsetFrameLoadDelegate: を使うんだ。

WebKit/WebView.h

- (void)setFrameLoadDelegate:(id)object;

初期化のためのメソッドのあたりで、WebView のこのメソッドを読んでやればい い。デリゲートとしては、自分自身を設定しよう。ソースコードは、こんな感じになる。

(sample)

...
[webView setFrameLoadDelegate:self];
...

これで、上で見たデリゲートメソッドが呼び出されるようになるぜ。

5.3 実装

じゃ、実際の作業だ。前回のプロジェクトの続きから行おう。まず、MyDocument クラスにアウトレットを追加してやる必要があるんだ。

■URL テキストフィールドのためのアウトレットを追加する

1. MyDocument.nib を開く。MyDocument.nib をダブルクリックしてくれ。 Interface Builder が立ち上がるので、そちらに移動する。

2. MyDocument クラスにurlTextField アウトレットと、WebView のためのアウト レットwebView を追加する。Classes タブに移動して、MyDocument クラスを探し てくれ。インスペクタパネルで、アウトレットを追加しよう。URL テキストフィール ドを指し示すためのurlTextField と、WebView のためのwebView だ。

outlets.jpg
図5-1 MyDocument のアウトレット

3. アウトレットを接続する。まず、Instances タブに戻ろう。そして、File's Owner アイコンを選択してくれ。アウトレットを接続するために、Ctrl キーを押しながらド ラッグしよう。線が引き出されるはずだ。それを、URL を入力するためのテキスト フィールドまでつないでくれ。つないだら、インスペクタパネルから、urlTextField を選んで「Connect」ボタンを押す。これで、urlTextField アウトレットと、画面上 のURL を入力するためのテキストフィールドが関連付けられた。同様に、webViewもつなごう。

4. MyDocument のためのファイルを作る。Classes タブに戻り、MyDocument を 選択して、「Classes」→「Create Files for MyDocument」を選択してくれ。そし て、MyDocument.h とMyDocument.m のファイルを、プロジェクトの中に作る。 古いファイルは上書きしていいよ。

ここまでできたら、セーブしてProject Builder に戻ろう。

■ソースコードの編集

5. MyDocument.h を編集する。MyDocument.h は、基本的にはInterface Builder で作られたとおりでいい。でも、ひとつ注意するのは、WebKit のヘッダファイルをイ ンポートしておく必要があるんだ。これで、WebKit の機能が使えるようになる。イン ポート文は、#import <WebKit/WebKit.h> という形で書くんだ。

MyDocument.h は、こんな感じになる。


MyFristBrowser/MyDocument.h

#import <Cocoa/Cocoa.h>
#import <WebKit/WebKit.h>
@interface MyDocument : NSDocument
{
  IBOutlet id webView;
  IBOutlet id urlTextField;
}
@end

6. MyDocument.m を編集する。やることは、まずデリゲートの設定。 WebFrameLoadDelegate として、自分自身を設定するんだ。そして、そのデリゲートメソッドの設定だ。

まず、デリゲートを設定しよう。それには、NSDocument のメソッド windowControllerDidLoadNib: を使う。こんな感じで実装する。

MyFristBrowser/MyDocument.m

- (void)windowControllerDidLoadNib:(NSWindowController*)windowController
{
  // WebView のデリゲートを設定します
  [webView setFrameLoadDelegate:self];
}

続いて、デリゲートメソッドの実装。まず、ページの読み込みを始めるときに呼び出 される webView:didStartProvisionalLoadForFrame: を使う。ここでは、URL テキストフィールドに、これから読み込むURL を設定するんだ。

MyFirstBrowser/MyDocument.m

- (void)webView:(WebView*)sender
didStartProvisionalLoadForFrame:(WebFrame*)frame
{
  // フレームがメインフレームの場合
  if (frame == [sender mainFrame]) {
    // URL を文字列型で取得します
    NSString*  urlStr;
    urlStr = [[[[frame provisionalDataSource]
      request] URL] absoluteString];

    // URL を設定します
    [urlTextField setStringValue:urlStr];
  }
}

まず、対象となるフレームがメインフレームかどうか、チェックする。そして、 URL を文字列形で取り出して、URL テキストフィールドに設定するんだ。

もう1 つ、デリゲートメソッドを実装する。 webView:didReceiveTitle:forFrame: だ。名前から想像が付く通り、ブラウザ ウィンドウのタイトルを設定する。

MyFirstBrowser/MyDocument.m

- (void)webView:(WebView*)sender
      didReceiveTitle:(NSString*)title
      forFrame:(WebFrame*)frame
{
  // フレームがメインフレームの場合
  if (frame == [sender mainFrame]) {
    // タイトルを設定します
    [[sender window] setTitle:title];
  }
}

これでオッケーだ。

7. 実行する。実行できたら、適当なリンクをクリックしてみてくれ。URL が変わっ て、読み込みが開始されたらタイトルが変わるのが分かると思うよ。

browser-1.jpg
図5-2 MyFirstBrowser2 動作図


■ここまでのプロジェクト:
MyFirstBrowser2.zip