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



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

番红花素组合火焰

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

在这种情况下,我需要调用一个 Xcode 方法,该方法可以查询数据库(位于应用程序的文档文件夹中(并返回演示文稿名称和其他一些详细信息。

我在这里遇到了两个问题

1(我遇到了

**– webView:shouldStartLoadWithRequest:navigationType:**

但是此方法返回 BOOL,我想返回包含其他信息的演示文稿

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

任何建议将不胜感激。提前谢谢。

你几乎可以在webView:shouldStartLoadWithRequest:navigationType做你需要做的事情。

  1. 如果从中返回NO,则 Web 视图将不会加载当前请求;这将使您的应用无需执行任何需要的操作:

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

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

编辑:

阐述更多选项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;
    }
    

您应该在此处定义:

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

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

和:

  [self loadContentInWebView:HERE_THE_HTML];

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

我得到了一个解决方法。虽然这不是一个好的做法:

在模型中:每当收到对此 Web 视图的请求时,即使页面在 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;
    }

最新更新