我有一个基于UIWebView的应用程序,它存储一些状态。我有一个原生标签栏和上栏。我需要的是当我点击本机栏时,我会保存存储在UIWebView中的数据。
为此,我调用了evaluateJavaScriptByString来创建一个JSON对象,并通过UIWebViewDelegate协议对objective-C进行回调。
但是,我发现回调是异步的,因此我的主要事务在数据加载之前发生。
知道如何解决这个问题吗?
更新:更好地解释问题: -
发生的事情是,一旦我点击按钮,javascript调用就会发生在页面上(创建一个JSON字符串以发送到Objective-C),这些数据会保存到obj-c模型中。但是,这是异步发生的。因此,在将数据加载到模型之前,我的屏幕会发生变化。如果我刷新下一个屏幕,它会显示正确的数据。我想知道是否有办法解决这个问题。
注意,我知道如何从WebViews调用objective-C函数。无论如何,我们正在使用JSOBjBridge。
答案 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];
}
我没有测试这段代码,我只是从头开始编写它,但它应该可以工作,我已经用这种方式做了。