Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/108.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios Objective-C在UIWebView中调用javascript调用Objective-C;线程问题_Ios_Uiwebview - Fatal编程技术网

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

Ios Objective-C在UIWebView中调用javascript调用Objective-C;线程问题,ios,uiwebview,Ios,Uiwebview,我有一个基于UIWebView的应用程序,它正在存储一些状态。我有一个本地标签栏和上栏。我需要的是,当我单击本机栏时,我将保存UIWebView中存储的数据 为此,我调用evaluateJavaScriptByString来创建一个JSON对象,它通过UIWebViewDelegate协议回调objective-C 但是,我发现回调是异步的,因此我的主事务发生在加载数据之前 你知道如何解决这个问题吗 更新:为了更好地解释问题:- 我有一个HTML页面,其中包含一个表单,有人将一些数据放入其中

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

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

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

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

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

  • 我有一个HTML页面,其中包含一个表单,有人将一些数据放入其中
  • 我的标签栏是本地的
  • 单击选项卡栏上的按钮,我希望将HTML中的数据保存到Objective-C模型中,并且视图应更改为其他视图
所发生的事情是,一旦我单击按钮,javascript调用就会发生在页面上(创建一个JSON字符串发送到Objective-C),并且这些数据会保存到obj-C模型中。但是,这是异步发生的。因此,在将数据加载到模型中之前,我的屏幕会发生变化。如果我刷新下一个屏幕,它会显示正确的数据。我想知道是否有办法解决这个问题


注意,我知道如何从WebView调用OBjective-C函数。无论如何,我们都在使用JSOBjBridge。

只需添加如下内容
@“some\u var=MAKE\u JSON();window.location=\”myapp://callback/\“+escape(some_var)”
在javascript代码末尾,您可以将其转移到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];
}

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

使用JSObjBridge已经发生了这种情况。问题不是这样。为了更好地解释这个问题:-如果我理解正确,您可以在tabbar controller:shouldSelectViewController:中返回NO,并在数据写入模型时手动更改选项卡,这可以使用notificationcenter完成。不管怎样,什么是JSObjBridge?是您的还是第三方的?是的,JSOBjBridge是第三方,但从Javascript调用Obj-C函数是相当标准的。需要了解notificationcenter。如果可以修改JSOBjBridge的源,请在从WebView接收数据时添加发送通知,并在应用程序中为此通知调用addObserver。==如果不能修改JSOBjBridge,则需要使用键值观察来观察更改模型的数据。