UIWebView

Tatsuro Ueda edited this page Mar 11, 2014 · 2 revisions

UIWebViewの状態監視

ページをロードしている間はUIActivityIndicatorを使って「処理中」のステータスをユーザに明示した方が良い。

ページの読み込み開始と完了を検知するため、UIWebViewのdelegateプロパティに通知を受けるデリゲートを指定することができる。

// 呼ばれるタイミング:コンテンツの読み込みが開始した直後
- (void)webViewDidStartLoad:(UIWebView *)webView

// 呼ばれるタイミング:コンテンツの読み込みが完了した直後
- (void)webViewDidFinishLoad:(UIWebView *)webView

// 呼ばれるタイミング:コンテンツの読み込み中にエラーが発生したタイミングで呼ばれる
//  複数回呼ばれることがある
- (void)webView:(UIWebView *)webView didFailLoadWithError:(NSError *)error

// 呼ばれるタイミング:コンテンツの読み込みが開始する直前に呼ばれる
// ここでYESを返すとコンテンツの読み込みをUIWebViewに任せる
// NOを返すとUIWebViewは読み込み処理をしない
// リンククリック時に独自の処理をしたい場合にはNOを返して、ここで実行する
- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request 
navigationType:(UIWebViewNavigationType)navigationType

WebViewの操作

プロパティ/メソッド 役割
loadingプロパティ 現在、ページを読み込み中かどうかを確認する。読み込み中ならYES。
canGoBackプロパティ goBackメソッドを実行できる状態かどうかを確認する。できるならYES。
canGoForwardプロパティ goForwardメソッドを実行できる状態かどうかを確認する。できるならYES。
goBackメソッド 前のページに戻る
goForwardメソッド 次のページに進む
reloadメソッド 現在のページを再読込する
stopLoadingメソッド ページの読み込みを中止する

メディアデータの表示

JPEGファイルの表示

/*
 UIWebViewはviewDidLoadメソッド等であらかじめ作成済みとする
 */
- (void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];

    NSString *path;
    if ((path = [[NSBundle mainBundle] pathForResource:@"dog" ofType:@"jpg"]))
    {
        NSData *data = [NSData dataWithContentsOfFile:path];
        [self.webView loadData:data MIMEType:@"image/jpeg" textEncodingName:nil baseURL:nil];
    }
}

PDFファイルの表示

/*
 UIWebViewはviewDidLoadメソッド等であらかじめ作成済みとする
 */
- (void)viewDidAppear:(BOOL)animated
{
    [super viewDidAppear:animated];

    NSString *path;
    if ((path = [[NSBundle mainBundle] pathForResource:@"sample" ofType:@"pdf"]))
    {
        NSData *data = [NSData dataWithContentsOfFile:path];
        [self.webView loadData:data MIMEType:@"application/pdf" textEncodingName:nil baseURL:nil];
    }
}

Wordファイルの表示

loadRequest:メソッドでも表示することができる。

- (void)viewDidAppear:(BOOL)animated
{
    [super viewDidAppear:animated];

    NSString *path = [[NSBundle mainBundle] pathForResource:@"sample.doc" ofType:nil];
    NSURL *url = [NSURL fileURLWithPath:path];
    NSURLRequest *request = [NSURLRequest requestWithURL:url];
    [self.webView loadRequest:request];
}

HTML文字列の指定

UIWebViewは、URLを指定してWebページを表示するだけでなく、loadHTMLString:baseURL:メソッドにHTML文字列を直接指定して、そのHTMLを描画する機能もある。

- (void)viewDidAppear:(BOOL)animated
{
    [super viewDidAppear:animated];

    NSString *html = @"<b>【電話番号】</b><br />"
    "090-0000-0000<hr />"
    "<b>【ホームページ】<b /><br />"
    "http://www.apple.com/";

    [self.webView loadHTMLString:html baseURL:nil];
}

リンクのタップのハンドリング

リンククリックはUIWebViewプロトコルのwebView:shouldStartLoadWithRequest:navigationType:メソッドで検知できる。

UIWebViewNavigationType 渡されるタイミング リクエストの内容
UIWebViewNavigationTypeLinkClicked リンクがタップされたとき リンク先URL
UIWebViewNavigationTypeFormSubmitted formがサブミットされたとき formのactionの内容
UIWebViewNavigationTypeBackForward goBackもしくはgoForwardでページ移動するとき 移動先のURL
UIWebViewNavigationTypeReload ページが再ロードされるとき 再ロードされるURL
UIWebViewNavigationTypeOther loadRequest:メソッド等でコンテンツを読み込んだときなど

JavaScriptの実行

stringByEvaluatingJavaScriptFromString:メソッドにJavaScriptのスクリプトを渡すと、その結果をNSStringで取得することができる。