8

次のように、View ControllerにUIWebViewが埋め込まれています。

ここに画像の説明を入力

Web ビュー ( ) へのアウトレットがあり、これを使用して_graphTotalコンテンツを正常にロードできます。test.html

[_graphTotal loadRequest:[NSURLRequest requestWithURL:[NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"test" ofType:@"html"]isDirectory:NO]]];

私は今、データを Web ビューに渡そうとしていますが、運がありませんでした。を追加しましたが、これが<UIWebViewDelegate>私が試していることです:

NSString *userName = [_graphTotal stringByEvaluatingJavaScriptFromString:@"testFunction()"];
NSLog(@"Web response: %@",userName);

そして、ここtest.htmlに私のプロジェクトの内容があります:

<html>
  <head></head>
  <body>
    Testing...
      <script type="text/javascript">
        function testFunction() {
          alert("made it!");
          return "hi!";
        }
        </script>
  </body>
</html>

webView に「Testing...」と表示されますが、アラートも返された「hi!」も表示されません。ストリング。

私が間違っていることは何か分かりますか?

4

1 に答える 1

16

問題は、webview がページをロードする前に JavaScript を評価しようとしたことです。最初に<UIWebViewDelegate>プロトコルを View Controller に採用します。

@interface ViewController : UIViewController <UIWebViewDelegate>

次に、webview のデリゲートをビュー コントローラーに接続し、リクエストを作成して、最後にデリゲート メソッドを実装します。これは、webview の読み込みが完了したときに通知するものです。

- (void)viewDidLoad
{
    [super viewDidLoad];

    [self.graphTotal loadRequest:[NSURLRequest requestWithURL:[NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"test" ofType:@"html"]isDirectory:NO]]];
}

- (void)webViewDidFinishLoad:(UIWebView *)webView
{
    NSString *userName = [self.graphTotal stringByEvaluatingJavaScriptFromString:@"testFunction()"];
    NSLog(@"Web response: %@",userName);
}

PS:この方法で JavaScript を評価する際に注意しなければならない制限の 1 つは、スクリプトを 10 秒以内に実行する必要があるということです。したがって、たとえば、アラートを閉じるのに 10 秒以上待機した場合、エラーが発生します ( 10 秒待機した後に戻ることができませんでした)。ドキュメントで制限事項の詳細を確認してください。

于 2013-06-14T22:16:36.220 に答える