UIWebView補足

エラー発生時に走る『didFailLoadWithError』メソッドは、ページの読み込みを途中でキャンセルした時にも呼ばれてしまうらしい。
読み込みキャンセル時に何かエラーが発生した場合は別として、単純にページを読み込んでる間に前のページに戻っただけなのにエラーになってしまっては、困る。

で、それを回避するためには、以下のコードで、読み込みキャンセル時のエラーを決め打ちで回避してやる必要があるようだ。

NSInteger err_code = [error code];
if (err_code == NSURLErrorCancelled) {
    return;
}

UIWebViewアレコレ

画面に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;