Soupstock

iOSアプリ開発覚書

UIWebViewで読み込みが完了したことを判断する

UIWebViewで読み込みが完了したとき通常webViewDidFinishLoadが呼ばれますが、フレームなどを使用したページではwebViewDidFinishLoadが複数回呼ばれ読み込みが完了したタイミングがわからない場合があります。networkActivityIndicatorVisibleなどを設定する場合に本当に読み込みが完了したタイミングを知りたい場合は以下のようにします。


まずヘッダに読み込み中のプロパティを宣言します

@property (nonatomic) NSInteger webViewLoadingCount;


次に実装ファイルでwebViewDidStartLoadでプロパティをインクリメント、webViewDidFinishLoadとdidFailLoadWithErrorでプロパティをデクリメントします

- (void)webViewDidStartLoad:(UIWebView *)webView {
        self.webViewLoadingCount++;
	[UIApplication sharedApplication].networkActivityIndicatorVisible = YES;
}

- (void)webViewDidFinishLoad:(UIWebView *)webView {
	self.webViewLoadingCount--;
	if (self.webViewLoadingCount > 0) {
                // Loading
		return;
	}
        [UIApplication sharedApplication].networkActivityIndicatorVisible = NO;

        // Load complete
}

- (void)webView:(UIWebView *)webView didFailLoadWithError:(NSError *)error {
	self.webViewLoadingCount--;
	if (self.webViewLoadingCount > 0) {
                // Loading
		return;
	}
	[UIApplication sharedApplication].networkActivityIndicatorVisible = NO;

        // Load complete with error
}

補足
最初はUIWebViewのloading(isLoading)プロパティで判断しようとしましたが、読み込み中でもNOが返ってきたりして判断できませんでした。
またJavascriptの実行が完了したかどうかの判定のしかたは不明です:)