iPhone(開発)/UIWebViewを使う

iPhone(開発)/UIWebViewを使う

プログラムコードから画面に埋め込む

//オブジェクト作成
UIWebView* webView = [[UIWebView alloc]] init];
//大きさと位置決定
webView.frame = CGRectMake(0, 0, 300, 400);
//画面のどこかにはっつける
[ hogeView addSubView: webView ];

指定したURLを読み込んで表示(表示するだけ)

埋め込んだ状態で、loadRequestメソッドを使う

NSURL* url = [ NSURL URLWithString:@"http://www.hogehoge.co.jp/" ];
NSURLRequest* request = [ NSURLRequest requestWithURL:url ];
[ webView loadRequest:request ];

指定したローカルファイルを読み込んで表示(表示するだけ)

埋め込んだ状態で、URLを読みこむと同様にloadRequestメソッドを使う

NSString* fileName = @"hogehoge.html";
NSString* filePath = [[NSBundle mainBundle] pathForResource:fileName ofType:@"html"];
NSURLRequest* request = [ NSURLRequest requestWithURL:[ NSURL fileURLWithPath:filePath ] ];
[ webView loadRequest:request ];

HTMLっぽい文字列を読み込んで表示(表示するだけ)

NSString* html = @"<html><head></head><body>hoge</body></html>";
NSString* fileName = @"hogehoge.html";
NSString* filePath = [[NSBundle mainBundle] pathForResource:fileName ofType:@"html"];
[ webView loadHTMLString:html baseURL:[ NSURL: fileURLWithPath:filePath ] ];

baseURLのセレクタの部分で変なことをしているが、 ここにそれっぽい値が入ってないとJavaScriptによっては正常に作動しない可能性がある。

サンプルではよくnilを突っ込んでるが、一部のJavaScriptが動作しなかった。

UIWebViewの挙動をコントロールする

単にUIWebViewを作って張ってURLをぶち込んだだけだと表示しかできず、別に何をクリックしても何も動かない。 動かすためにはプロトコルUIWebViewDelegateを実装したオブジェクトをUIWebViewのdelegateに取り込む必要がある。

UIWebViewDelegate Protocol Reference

適当なクラスにUIWebViewDelegateプロトコルをくっつけて

- (void)webView:(UIWebView *)webView didFailLoadWithError:(NSError *)error;
- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType;
- (void)webViewDidFinishLoad:(UIWebView *)webView;
- (void)webViewDidStartLoad:(UIWebView *)webView;

の4つのメソッドを実装すればよい。

実装したクラスからallocしてオブジェクトを作り、本体にぶち込んでやればよい

[ webView setDelegate:hoge ];

リンクをクリックした時の挙動のコントロール

リンクをクリックするととwebView:shouldStartLoadWithRequest:navigationTypeメソッドが呼ばれる・・・ってか、Objective-Cのメソッドは長すぎて記述性とか可読性が著しく低くなるな・・・

なのでこれを実装する。

- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType
{
    if(navigationType == UIWebViewNavigationTypeLinkClicked){
        //クリックで発生したリクエストならば・・・
        //safariで開くよ
        [[UIApplication sharedApplication] openURL:[request URL]];
        return NO; //safariで開いたから内部では遷移しないよ
 
        //このメソッドは最初のこちらから指定するURLでの読み込みに対しても呼び出される。
    }
 
    return YES;
}

このメソッドはYESを返すとUIWebView内部で遷移し、NOを返すと何もしないという挙動になる。 引数から状況がわかるので分岐してコントロールする

バージョン

2012-03-09 新規

タグ

phone/iphone/iphone_dev/using_uiwebview.txt · 最終更新: 2017-09-26 19:04 by ore