2011-01-14 16 views
13

私はUIWebViewを持っています。これはHTMLページを読み込みます。このページには2つのボタンがあります。ユーザーが終了ボタンをクリックできないようにするため、ページの読み込みが完了すると(webViewDidFinishLoadが呼び出されます)、stringByEvaluatingJavaScriptFromStringを使用して、HTMLを操作してこれらのボタンの1つを削除します。また、UIWebViewのユーザー対話を無効にしてwebViewDidStartLoadに設定し、webViewDidFinishLoadで再び有効にします。stringByEvaluatingJavaScriptFromStringが終了したときの判断

私が見つけた問題は、stringByEvaluatingJavaScriptFromStringが完了するまでに2〜2時間かかることです。それは自分のスレッドで行われているようです。したがって、webViewDidFinishLoadが呼び出され、UIWebViewでユーザー対話が有効になり、ユーザーが素早い場合は、stringByEvaluatingJavaScriptFromStringが終了する前に[終了]ボタンをクリックすることができます。 stringByEvaluatingJavaScriptFromStringはそれ自体のスレッドであると思われるので、完了したら(それはwebViewDidFinishLoadと呼ばれません)、終了ボタンをタップできないようにするための唯一の方法は、UIWebViewいくつかの遅延は、信頼性がありません(どのように私は本当にどのくらいの遅延を知ることができますか?)。

stringByEvaluatingJavaScriptFromStringはスレッド上で行われていますが、完了した時点を伝える方法がありません。この問題を回避する方法についての他の提案はありますか?

EDIT:実行されているUIWebViewstringByEvaluatingJavaScriptFromStringながら、無効にすることができ、およびJavaScriptが終了したときUIWebViewを再度有効にした場合要するに、私が知りたいです。

EDIT 2:そこは何とかそれが終了していますときに表示するためにJSエンジンをポーリングすることができます意味すると思わここに記事がありますが、私は同じこと言って、他の参照を見つけることができません。http://drnicwilliams.com/2008/11/10/to-webkit-or-not-to-webkit-within-your-iphone-app/

をEDIT 3ブラッドスミスからの答えに基づいて、私は実際には、UIWebViewは、javascriptが実行された後にロード自体を完了したことを知る必要があるようだ。私はちょうどそこに種類の遅れを置く必要があるようにますます見ています。

+2

ここで同じ問題が発生します。あなたの解決策は何でしたか? –

+0

私は、一定の時間がかかると仮定して、少なくともその時間だけ処理を遅らせる必要があると思います。 –

+1

同じ問題。そうですね、これを行うにはよりよい方法が必要です。 –

答えて

2

ページに挿入しているJavaScriptを他の場所(document.location = "foo")に移動し、webView:ShouldLoadRequest:を使用してそのリクエストを検索し、トリガーと同様に返すことができます何をする必要がありますか(通常ははいを返します)。

+0

うーん、興味深い。恐ろしい回避策のように聞こえるかもしれませんが、ちょうどうまくいくかもしれません... –

+0

悲しいことに、これは私にとってはうまくいかないようです。私はdocument.locationには、私は注入しているjavascriptの最後に配置したが、これはまだ終了ボタンが消えてしまう前に呼び出されるようです。 JSは既に実行されているようですが、WebViewは変更の処理を完了していません。 –

1

stringByEvaluatingJavascriptFromStringが返されると終了する必要があります。これは別のスレッドで実行される可能性があります(おそらくUIを変更することができないためではありません)が、結果が返されるまで、メソッドは文字列の結果を返すことはできません。

+0

はい、私はwebviewが返されるまでjavascriptを実行できないことを認識しています。私が求めていることを明確にするために私の編集した質問を見てください。 –

2

stringByEvaluatingJavascriptFromStringを実行した後、あなたは

webView.userInteractionEnabled = NO; 
while (webView.loading) { 
    [[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:0.2]]; 
} 
webView.userInteractionEnabled = YES; 

は私があなたのためかその作業を知ってみましょうあなたの問題を解決するために、コードの下に試すことができます。

2

html要素のonclickイベントのスタブ関数を直接インライン展開する方法について説明します。より適切なときに、html要素をonclickイベントハンドラ関数にバインドすることができます。

<button onclick="function() { };"/>