2009-10-24 79 views
2

我正在使用UIWebView来显示验证码。如果用户输入验证码正确,则服务器使用JSON序列化返回数据。我不希望视图显示这个,而是我想拦截UIWebView的负载,如果它返回JSON序列化数据,我想要存储该数据并删除UIWebView。从UIWebView中读取JSON内容

我正在考虑为UIWebView设置委托并使用它的webViewDidFinishLoad,但是如何获取加载的内容?

回答

7

您可能想要考虑定义UIWebViewDelegate并使用 webView:shouldStartLoadWithRequest:navigationType:来拦截请求并对其进行处理。

对于您的情况,您将评估NSURLRequest并返回NO以防止加载WebView。接下来,您将创建一个具有相同请求的单独NSURLConnection,并设置一个委托来接收(JSON)响应。

+0

好主意,为我工作。 – jarnoan 2010-10-21 14:31:36

+1

@jarnoan你想分享你的代码,我没有得到这个答案 – 2011-02-23 12:09:58

5

我想出了这个(也许不是很漂亮)解决方案:

而不是返回一个只JSON响应,我使用我用来验证码相同的HTML模板。如果验证码成功,我送我想HTML模板的JSON,显示它在一个隐藏的div与ID:

<html> 
<body> 

{% if captcha_success %} 

<div id="json" style="display: none">{"jsonvalue":"{{result}}"}</div> 

{% else %} 

// display captcha as usual 

{% endif %} 

</body> 
</html> 

,然后我可以用得到webViewDidFinishLoad内容:

- (void)webViewDidFinishLoad:(UIWebView *)webView 
{ 
NSString *res = [webView stringByEvaluatingJavaScriptFromString:@"document.getElementById('json').innerHTML"]; 
NSDictionary *json = [[CJSONDeserializer deserializer] deserializeAsDictionary:[res dataUsingEncoding:NSUTF8StringEncoding] error:nil]; 
// more stuff 
} 

一般而言,我认为这是非常容易和直接实施。