Objective-c[For loop]在UIWebview中加载HTML并从JavaScript函数中检索数据
我正在用Objective-c为IOS制作一个应用程序,我需要能够循环浏览一堆网页,并使用嵌入式javascript函数返回一些JSON值 我在应用程序的其他地方使用页面,javascript可以根据需要工作。在这一点上,我确实存储了JSON响应,但由于用户可能不会查看每个页面,应用程序不一定要检查所有JSON值 下面的代码部分是我用来循环所有页面、加载HTML字符串和运行javascript函数的部分。问题是这些值总是返回为空Objective-c[For loop]在UIWebview中加载HTML并从JavaScript函数中检索数据,javascript,objective-c,json,uiwebview,Javascript,Objective C,Json,Uiwebview,我正在用Objective-c为IOS制作一个应用程序,我需要能够循环浏览一堆网页,并使用嵌入式javascript函数返回一些JSON值 我在应用程序的其他地方使用页面,javascript可以根据需要工作。在这一点上,我确实存储了JSON响应,但由于用户可能不会查看每个页面,应用程序不一定要检查所有JSON值 下面的代码部分是我用来循环所有页面、加载HTML字符串和运行javascript函数的部分。问题是这些值总是返回为空 -(void)webViewDidFinishLoad:(UIWe
-(void)webViewDidFinishLoad:(UIWebView *)webView {
NSLog(@"finished loading");
NSString *jsonValues = [webView stringByEvaluatingJavaScriptFromString:@"getFields()"];
}
for (int i = 1; i <= shifts; i++)
{
ontracMultipleWevViewController *RT9909 = [viewControllerDictionary objectForKey:[NSString stringWithFormat:@"Shift %d RT9909", i]];
if (RT9909 && [RT9909.viewControllers count] > 0) {
for (ontracRTViewController *r9909 in RT9909.viewControllers) {
UIWebView *webView = [[UIWebView alloc] init];
[webView setDelegate: self];
[webView loadHTMLString:r9909.htmlString baseURL:[NSURL URLWithString:r9909.urlToLoad]];
[self webViewDidFinishLoad:webView];
[self.view addSubview:webView];
if([self webViewDidFinishLoad:webView]){
r9909.jsonValues = [webView stringByEvaluatingJavaScriptFromString:@"getFields()"];
if(r9909.jsonValues != nil && ![r9909.jsonValues isEqualToString:@""] && rt9909ShiftCount == 0){
........rest of code
-(void)webViewDidFinishLoad:(UIWebView*)webView{
NSLog(“已完成装载”);
NSString*jsonValues=[webView stringByEvaluatingJavaScriptFromString:@“getFields()”];
}
对于(int i=1;i 0){
用于(RT9909.ViewController中的OnTractViewController*r9909){
UIWebView*webView=[[UIWebView alloc]init];
[webView setDelegate:self];
[webView加载htmlString:r9909.htmlString基URL:[NSURL URLWithString:r9909.urlToLoad]];
[自webViewDidFinishLoad:webView];
[self.view addSubview:webView];
如果([self-webViewDidFinishLoad:webView]){
r9909.jsonValues=[webView stringByEvaluatingJavaScriptFromString:@“getFields()”];
如果(r9909.jsonValues!=nil&&![r9909.jsonValues isEqualToString:@”“]&&rt9909ShiftCount==0){
……代码的其余部分
注意:我没有收到任何错误或NSLogs来建议任何问题您需要隔离
if([self webViewDidFinishLoad:webView]){
r9909.jsonValues = [webView stringByEvaluatingJavaScriptFromString:@"getFields()"];
阻止for循环
&将标记
添加到您的网络视图中
实施
- (void)webViewDidFinishLoad:(UIWebView *)webView;
UIWebView
的可选委托功能放入
if(...) {
r9909.jsonValues = [webView stringByEvaluatingJavaScriptFromString:@"getFields()"];
}
这里的逻辑。
如果检查
,现在将基于您将分配的webview.tag
,它将在for循环中创建webview
,您需要隔离
if([self webViewDidFinishLoad:webView]){
r9909.jsonValues = [webView stringByEvaluatingJavaScriptFromString:@"getFields()"];
阻止for循环
&将标记
添加到您的网络视图中
实施
- (void)webViewDidFinishLoad:(UIWebView *)webView;
UIWebView
的可选委托功能放入
if(...) {
r9909.jsonValues = [webView stringByEvaluatingJavaScriptFromString:@"getFields()"];
}
这里的逻辑。
如果检查则现在将基于您将分配的webview.tag
,它将在for循环中创建webview
您正在调用您的selfwebviewdiffinishload:
?当webview完成加载时调用它的不是代理吗?@Larme感谢您的回复事实上,我忘了添加那个方法。@Larme也忘了所有关于委托的事情,现在我们来研究一下。Thanks@Larme我已经用代码更新了我的问题,以包含该委托(还将UIWebviewDelegate添加到.h文件中)。尽管您不了解委托模式,但仍然存在相同的问题,并且此调用应该是异步的。不要称自己为webViewDidFinishLoad:
。我的猜测是,您没有通过if([self webViewDidFinishLoad:webView])
。您正在调用自己的webViewDidFinishLoad:
?当webView完成加载时,调用它的不应该是代理吗?@Larme谢谢您的回复,我实际上忘记添加该方法了。@Larme也忘了所有关于代理的事情,现在我们来研究一下。Thanks@Larme我已经用代码更新了我的问题,以包括委托(还将UIWebviewDelegate添加到.h文件中)。尽管您不了解委托模式,但仍然存在相同的问题,并且此调用应该是异步的。不要称自己为webViewDidFinishLoad:
。我猜,您没有通过if([self-webViewDidFinishLoad:webView])
。请确保将代码块4个空格作为选项卡,而不是使用“``”,为您编辑了格式:)谢谢您的回复@yStack我不确定我是否可以不使用for循环
,因为我需要迭代x
的数量shifts@jampez77循环的for
仍然存在,只是您(以编程方式)不要调用webViewDidFinishLoad:
函数。当webview实际加载完其内容时,操作系统将调用webViewDidFinishLoad:
&您将从此处继续执行您的操作。@yStack啊,好的,我现在同意您的意见。问题是操作系统没有调用webViewDidFinishLoad
。请确保您的选项卡代码块4个空格,而不是使用“`”,为您编辑了格式:)谢谢您的回复@yStack我不确定我是否可以不使用for循环
,因为我需要迭代x
的数量shifts@jampez77循环的for
仍然存在,只是您(以编程方式)不要调用webViewDidFinishLoad:
函数。当webview实际完成加载其内容时,操作系统将调用webViewDidFinishLoad:
&您将从此处继续执行操作。@yStack啊,好的,我现在同意了。问题是操作系统没有调用webViewDidFinishLoad
。