我有一个基于 UIWebView 的应用程序正在存储一些状态。但是,我有一个本地标签栏和上栏。我需要的是当我点击原生栏时,我持久化存储在 UIWebView 中的数据。
为此,我调用了 evaluateJavaScriptByString 来创建一个 JSON 对象,它通过 UIWebViewDelegate 协议(protocol)对 Objective-C 进行回调。
但是,我发现回调是异步的,因此我的主要事务发生在数据加载之前。
知道如何解决这个问题吗?
更新:为了更好地解释问题:-
- 我有一个 HTML 页面,其中包含有人将一些数据放入其中的表单。
- 我的标签栏是原生的。
- 单击选项卡栏上的按钮时,我希望将 HTML 中的数据保存到 Objective-C 模型中,并且 View 应更改为其他 View 。
发生的事情是,一旦我单击按钮,javascript 调用就会发生在页面上(以创建一个 JSON 字符串发送到 Objective-C),并且该数据会保存到 obj-c 模型中。但是,这是异步发生的。所以在数据加载到模型之前我的屏幕发生了变化。如果我刷新下一个屏幕,它会显示正确的数据。我想知道是否有办法解决这个问题。
请注意,我知道如何从 WebView 调用 OBjective-C 函数。无论如何,我们正在为此使用 JSOBjBridge。
最佳答案
只需在您的 JavaScript 代码末尾添加类似 @"some_var = MAKE_JSON(); window.location =\"myapp://callback/\"+ escape(some_var)"
的内容,你转移到 evaluateJavaScriptByString:
在 UIWebView 的委托(delegate)中实现 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];
}
我没有测试这段代码,我只是从头开始编写它,但它应该可以工作,我已经这样做了。
关于ios - Objective-C 在 UIWebView 中调用 javascript 回调 Objective-C;线程问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9378550/