画面にWebページを表示するUIWebViewの使い方とテクニックのまとめ。
前提
1.InterfaceBuilderでUIWebView(Safariと似てるアイコン)を画面上に配置、delegateなど基本的な繋がりを設定
2.IBからソース上に変数を構築
『Webページの表示(画面の表示と同時に特定のページを表示させる例)』
ソースに送って定義した変数(仮に_webView)を使って、Webページを表示させるには、loadRequestを使う。
- (void)viewDidLoad { [super viewDidLoad]; NSString *url = [NSString stringWithFormat:@"http://www.ayahumi.com/"]; NSURLRequest* request = [NSURLRequest requestWithURL:[NSURL URLWithString:url]]; [_webView loadRequest:request]; }
『日本語をURLに使う場合(Googleの検索結果に飛ばす場合など)』
日本語に限った話では無いと思うけど、2バイト文字は直接表示しようとしてもエラーで弾かれるので、エンコーディングをしてあげる必要がある。
- (void)viewDidLoad { [super viewDidLoad]; NSString *s_word = (NSString *)CFURLCreateStringByAddingPercentEscapes(NULL, (CFStringRef)@"検索文字列", NULL, CFSTR (";,/?:@&=+$#"), kCFStringEncodingUTF8); NSString *url = [NSString stringWithFormat:@"http://www.google.co.jp/m/search?q=%@",s_word]; NSURLRequest* request = [NSURLRequest requestWithURL:[NSURL URLWithString:url]]; [_webView loadRequest:request]; }
2012/3/1追記
原因は不明だけど・・・というか、おそらくバージョンによって規約が変わるせいなんだろうけど、NSStringの頭に『__bridge』を付けないとエラーになる場合があります。
NSString *s_word = (NSString *)CFURLCreateStringByAddingPercentEscapes(NULL, (CFStringRef)@"検索文字列", NULL, CFSTR (";,/?:@&=+$#"), kCFStringEncodingUTF8);
↓
NSString *s_word = (__bridge NSString *)CFURLCreateStringByAddingPercentEscapes(NULL, (CFStringRef)@"検索文字列", NULL, CFSTR (";,/?:@&=+$#"), kCFStringEncodingUTF8);
『WebView特有の動作の取得』
ヘッダファイルの@interfaceに以下を追記
@interface WebViewController : UIViewController
↓
@interface WebViewController : UIViewController<UIWebViewDelegate>
この追記を行うことで、Webページの読み込み中、読み込み完了、読み込みエラーの際にそれぞれ呼ばれるメソッドを実装できるようになる。
読み込み中
-(void)webViewDidStartLoad:(UIWebView *)webView
読み込み完了
-(void)webViewDidFinishLoad:(UIWebView *)webView
読み込みエラー
-(void)webView:(UIWebView *)webView didFailLoadWithError:(NSError *)error
『NowLoading』
Webページの読み込みは、読み込み中は画面上に何も表示されない。
読み込み中と読み込み完了のメソッドを使えば、NowLoadingのアニメーションを上部のバーに表示することができる。
-(void)webViewDidStartLoad:(UIWebView *)webView{ [UIApplication sharedApplication].networkActivityIndicatorVisible = YES; } -(void)webViewDidFinishLoad:(UIWebView *)webView{ [UIApplication sharedApplication].networkActivityIndicatorVisible = NO; }
『小ネタ』
deallocでwebViewをreleaseする場合、以下の記述が必要らしい。
_webView.delegate = nil;