Objective-C在UIWebView中调用javascript回调Objective-C;线程问题

时间:2012-02-21 13:37:29

标签: ios uiwebview

我有一个基于UIWebView的应用程序,它存储一些状态。我有一个原生标签栏和上栏。我需要的是当我点击本机栏时,我会保存存储在UIWebView中的数据。

为此,我调用了evaluateJavaScriptByString来创建一个JSON对象,并通过UIWebViewDelegate协议对objective-C进行回调。

但是,我发现回调是异步的,因此我的主要事务在数据加载之前发生。

知道如何解决这个问题吗?

更新:更好地解释问题: -

  • 我有一个HTML页面,其中包含某人将某些数据放入的表单。
  • 我的标签栏是原生的。
  • 单击选项卡栏上的按钮,我希望将HTML中的数据保存到Objective-C模型,并且视图应该更改为其他视图。

发生的事情是,一旦我点击按钮,javascript调用就会发生在页面上(创建一个JSON字符串以发送到Objective-C),这些数据会保存到obj-c模型中。但是,这是异步发生的。因此,在将数据加载到模型之前,我的屏幕会发生变化。如果我刷新下一个屏幕,它会显示正确的数据。我想知道是否有办法解决这个问题。

注意,我知道如何从WebViews调用objective-C函数。无论如何,我们正在使用JSOBjBridge。

1 个答案:

答案 0 :(得分:0)

只需在您的javascript代码末尾添加类似此@"some_var = MAKE_JSON(); window.location = \"myapp://callback/\" + escape(some_var)"的内容,即转移到evaluateJavaScriptByString:

在UIWebView的委托实现webView:shouldStartLoadWithRequest:navigationType:并捕获所有带有myapp://前缀的URL,如下所示:

- (BOOL)           webView: (UIWebView *) webView
shouldStartLoadWithRequest: (NSURLRequest *) request
            navigationType: (UIWebViewNavigationType) navigationType {
    NSString *url = @"myapp://";
    NSString *path = request.mainDocumentURL.relativePath;
    NSString *callbackURL = @"callback/";
    if ( [path hasPrefix:url] ) {
        path = [path substringFromIndex:[url length]];
        if ( [relPath hasPrefix:callbackURL] ) {
            NSString *json = [path substringFromIndex:[callbackURL length]];
            //TODO: Work with json
        }
        return NO;
    }
    return [super webView:webView shouldStartLoadWithRequest:request navigationType: navigationType];
}

我没有测试这段代码,我只是从头开始编写它,但它应该可以工作,我已经用这种方式做了。