使用Native iOS App中的变量调用Javascript函数

时间:2013-08-29 14:07:05

标签: javascript html ios objective-c uiwebview

我目前有一个成功加载html文件的Web视图。我所拥有的方法如下:

- (EmailView *)loadHTMLIntoEmailView:(EmailView *)emailView
{
    NSString *path = [[NSBundle mainBundle] pathForResource:@"inlineAttachmentTemplate" ofType:@"html"];
    NSData *htmlData = [NSData dataWithContentsOfFile:path];
    NSString *resourceURL = [[NSBundle mainBundle] resourcePath];
    resourceURL = [resourceURL stringByReplacingOccurrencesOfString:@"/" withString:@"//"];
    resourceURL = [resourceURL stringByReplacingOccurrencesOfString:@" " withString:@"%20"];
    NSURL *baseURL = [NSURL URLWithString:[NSString stringWithFormat:@"file:/%@//",resourceURL]];

    [emailView.webView loadData:htmlData MIMEType:@"text/html" textEncodingName:@"UTF-8" baseURL:baseURL];
    return emailView;
 }

我看起来的html文件:

<!doctype html>
<head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width,initial-scale=1">
    <link rel="stylesheet" href="inlineAttachmentTemplateStyling.css">

<script>
function myFunction()
   {
    document.write("Hello from my html file!!!!");

   }
</script>      

</head>
<body id="body">
 <div id="container">
     <img id="testImage" src="fauxImageAttachment2.JPG" />
 </div><!-- #container -->
</body>
</html>

这适用于图像显示在webview中。如果我将document.write从函数中取出并将其直接放在脚本标记内,则文本将显示在webview中。但是,我需要能够调用一个允许文本显示在webview中的函数(来自我的Objective C方法),最后我还需要传递这个函数一些变量。目前,我甚至无法弄清楚如何调用javascript函数。

我查看了这个示例Can you call a javascript function from native code (not in a callback) using PhoneGap and iOS?,并尝试将以下行添加到我的目标C方法中:

    [emailView.webView stringByEvaluatingJavaScriptFromString:@"myFunction()"];

但是这不会调用函数...或者至少文本没有出现在webview中 我是一个新手程序员,根本不了解javascript - 有人能突出我的错误吗?

1 个答案:

答案 0 :(得分:0)

我找不到一种方法来调用我正在加载到我的UIWebView中的html文档中定义的javascript函数(我不知道这是否,或者不可能)。但是我发现如果我不使用单独的html文件,我可以完成我的目标,而是直接在我的目标c代码中创建一个html字符串。我能够将变量传递给创建html字符串的函数,并且我也能够在html字符串中运行我的javascript。

以下是我创建html字符串的方法:

- (NSString *)htmlString:(NSString *)emailMessage {

    NSString *imageName = @"fauxImageAttachment2.JPG";

    NSString *string = [NSString stringWithFormat:@""
    "<!doctype html>"
    "<head>"
    "<meta charset='utf-8'>"
    "<meta name='viewport' content='width=device-width,initial-scale=1'>"
    "<link rel='stylesheet' href='inlineAttachmentTemplateStyling.css'>"
    "</head>"

    "<body id='body'>"
    "<div id='container'>"
    "<script type='text/javascript'>"
    "document.write('%@');"
    "</script>"
    "<img id='testImage' src='%@' />"
    "</div><!-- #container -->"
    "</body>"

    "</html>", emailMessage, imageName];

  return string;
}

以下是我将其加载到webview中的方法:

- (EmailView *)loadHTMLIntoEmailView:(EmailView *)emailView
{
   NSString *sampleEmailMessage = @"Hey! Check out this awesome photo I sent you!!!!!";
   NSString *path = [[NSBundle mainBundle] bundlePath];
   NSURL *baseURL = [NSURL fileURLWithPath:path];
    [emailView.webView loadHTMLString:[self htmlString:sampleEmailMessage] baseURL:baseURL];

    return emailView;
}

不确定这是否是最好的方法,但它可以用于我的目的。