从javascript函数调用xcode方法并获取返回值

时间:2012-05-10 07:18:01

标签: iphone xcode ios5

即时开发应用程序,需要加载一些菜单和演示文稿(pdf,flash等) 菜单项从数据库加载,每个菜单项包含ID和文本。菜单项如下所示:

藏红花素 Combiflame

以上菜单项是超链接,点击它们会在同一页面上打开演示文稿。

我需要在这个场景中调用一个xcode方法,它可以查询数据库(位于app中的文档文件夹中)并返回演示文稿名称和其他一些细节。

我在这里遇到两个问题

1)我遇到了

**– webView:shouldStartLoadWithRequest:navigationType:**

此方法返回BOOL 而我想要返回带有其他信息的演示文稿

2)不知道如何在同一页面上通过javascript加载演示文稿(我的应用程序的资源文件夹内)。

任何建议都将非常感谢。提前谢谢。

2 个答案:

答案 0 :(得分:1)

您可以在webView:shouldStartLoadWithRequest:navigationType中完成所需的工作。

  1. 如果您从中返回NO,那么网络视图将不会加载当前请求;这将使您的应用程序无需做任何需要:

  2. 然后您可以在同一个Web视图中加载不同的请求(比如嵌入演示文稿资源的HTML字符串),

  3. 或者,您可以向您的某个控制器发送消息,以完全运行不同的工作流程(显示不同的视图或其他类型)。

  4. 编辑:

    详细说明选项2:

    1. 假设您有一个嵌入UIWebView的视图控制器,并且还充当它的委托;

    2. 您可以在视图控制器中定义一个获取HTML字符串并将其加载到Web视图中的方法,如下所示:

      - (void)loadContentInWebView:(NSString*)content {
           [_webView loadHTMLString:content  baseURL:nil];
      }
      
    3. 现在,在webView:shouldStartLoadWithRequest:navigationType中,您可以执行以下操作:

      - (BOOL)webView:(UIWebView*)webView shouldStartLoadWithRequest:(NSURLRequest*)request navigationType:(UIWebViewNavigationType)navigationType {
              if ([[[request URL] absoluteString] isEqual:WHATEVER]) {
                   [self loadContentInWebView:HERE_THE_HTML];
                   return NO;
          }
          return YES;
      }
      
    4. 您应该在此处定义:

       ([[[request URL] absoluteString] isEqual:WHATEVER])
      

      ,即用于理解用户何时触及应该加载演示文稿的链接的逻辑;

        [self loadContentInWebView:HERE_THE_HTML];
      

      即,以某种方式定义您要使用的HTML内容,以便显示该演示文稿。

答案 1 :(得分:0)

我得到了一个解决方案......尽管这不是一个好习惯:

在模型中: 即使在webview中加载页面

,也会在此Web视图发出请求时调用此方法
- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType {
    // check the request, if it's ajax callback, just return NO; other wise YES;


//    NSURLRequest *request = [self request];
    NSURL *url = [request URL];

    NSString *file = [url lastPathComponent];
    if ([file isEqualToString:@"Presentation.html"] == YES) {
        return YES;
    }

    if ([file isEqualToString:@"ajaxcallback.htm"] == YES) {
        // that means the ajax call is done, so you can call this 
        NSString *result = [web stringByEvaluatingJavaScriptFromString:@"getResponse();"];

        // don't forget to stop loading this fake page
        return NO;
    }
}

并在javascript中:

   function sendRequestToApp(){
        window.location="http://www.domain.com/ajaxcallback.htm";
    }

    function getResponse(src){
        alert("response");
        document.getElementById("sample").src=src;
    }