0

我知道周围有很多这样的问题,但我的问题似乎与其他问题略有不同。我真正想做的就是从 javascript 调用一个客观的 C 方法我确信有一种方法可以做到这一点,而不必像许多答案和教程中所建议的那样来回发送参数。这样做的目的是让我的 phonegap 应用程序的用户能够单击 HTML 按钮来隐藏状态栏。为此,我必须找到一种方法来告诉我的应用程序运行我的目标 C 方法HideStatusBar

-(void) HideStatusBar {
  [[UIApplication sharedApplication] setStatusBarHidden:NO withAnimation:UIStatusBarAnimationSlide];
}

我不想发送任何参数,我要求你向我解释的是如何告诉 obj c 从 javascript 进行方法调用。我知道一种解决方案是将参数设置到 webviews 地址字段中,然后通过 obj C 获取,但我确信在我的情况下有更简单的解决方案。

我开始尝试编写一个 phonegap 插件,但我从来没有得到“消息越过”到“另一边”,因此目标 C 中的方法调用由于某种原因从未发生过。如果您愿意,我可以在此处发布代码,但我认为必须有一个更简单的解决方案。

任何人都可以向我解释从 javascript 中调用 obj c 方法的最简单方法吗?

编辑

我得到了这个工作,但shouldStartLoadWithRequest唯一在第一次加载 webview 时被调用(如标题所示)。这意味着如果我更新 URL,则不会调用该方法。这就是我现在的做法:

Javascript

('#hideStatusBar').live('click',function(event) {
    window.history.pushState('page2', 'Title', '/doc.html://hideStatusBar');
});

目标 C

- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request
 navigationType:(UIWebViewNavigationType)navigationType {

//NSString *currentURL = request.URL.absoluteString;

if([request.URL.absoluteString isEqualToString:@"http://domain.com/doc.html://hideStatusBar"]){
    [[UIApplication sharedApplication] setStatusBarHidden:YES withAnimation:UIStatusBarAnimationSlide];
    return NO;
}
return YES;
}

如前所述,我希望每次通过 javascript 更新 HTML 文档的 URL 时都运行此方法。还有什么想法吗?

4

2 回答 2

1

最简单但我认为错误的方法是使用 UIWebViewDelegate 方法 shouldStartLoadWithRequest。

- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request
                                                 navigationType:(UIWebViewNavigationType)navigationType {
    //suppose you call yourApp://hideStatusBar
    if([request.url.absoluteString isEqualToString:@"yourApp://hideStatusBar"]){
        [self hideStatusBar];
        return NO;
    }
    return YES; 
}

来自 javascript

document.location = 'yourApp://hideStatusBar'

如果您已经使用 Cordova(Phonegap),您可以构建一个简单的插件来避免弄乱请求。

于 2013-02-09T00:04:24.443 回答
1

示例中的教程有正确的想法。你做你自己的快速 URL 方案并将一个参数(或其他)序列化到 URL 中。

如果用户正在浏览UIWebView您控制的链接,您可以修补webView:shouldStartLoadWithRequest:navigationType:并使用该链接在用户单击链接时进行拦截。然后,您的委托会拦截 URL,而不是让 UIWebView 更改位置,而是在委托上调度代码的执行。

于 2013-02-09T00:05:48.730 回答