Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.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
告诉stringByEvaluatingJavaScriptFromString:何时完成_Javascript_Ios_Objective C_Uiwebview - Fatal编程技术网

告诉stringByEvaluatingJavaScriptFromString:何时完成

告诉stringByEvaluatingJavaScriptFromString:何时完成,javascript,ios,objective-c,uiwebview,Javascript,Ios,Objective C,Uiwebview,我使用的是标准UIWebView,需要知道stringByEvaluatingJavaScriptFromString:何时完成。我知道WKWebView有一个完成处理程序,但我需要使用当前提供的UIWebView。因为该方法需要在主线程上运行,所以GCD没有多大帮助。有什么建议吗 -(void)insertValue:(NSString*)value inWebView:(UIWebView*)webView{ NSString *jsString = [NSString string

我使用的是标准UIWebView,需要知道stringByEvaluatingJavaScriptFromString:何时完成。我知道WKWebView有一个完成处理程序,但我需要使用当前提供的UIWebView。因为该方法需要在主线程上运行,所以GCD没有多大帮助。有什么建议吗

-(void)insertValue:(NSString*)value inWebView:(UIWebView*)webView{
    NSString *jsString = [NSString stringWithFormat:kConstantJSString, value];
    [webView stringByEvaluatingJavaScriptFromString: jsString];
    NSLog("THIS SHOULD LOG WHEN JS HAS EXECUTED");
}

好的,我想出了一个好办法。 在javascript调用中,在脚本末尾添加以下行:

window.location='js ObjC:jsCompleted'

然后使用UIWebView的shouldStartLoadWithRequest:方法捕获并测试此新窗口位置。然后,我用新窗口位置中第二个组件的名称调用了一个选择器

-(BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType{
 if ([[[request URL] absoluteString] hasPrefix:@"js-ObjC:"]) { //get location change
     NSArray *components = [[[request URL]absoluteString] componentsSeparatedByString:@":"];
     NSString *functionName = [components objectAtIndex:1];

     /* Calls selector for functionName, this way silences compiler warning */
     SEL selector = NSSelectorFromString(functionName);
     ((void (*)(id, SEL))[self methodForSelector:selector])(self, selector);

     return NO;
 }
return YES;
}

}

但是[UIWebView stringByEvaluatingJavaScriptFromString:]是同步的,并且在计算所有javascript代码之前不会返回。也许您执行的代码在javascript中启动了另一个异步任务,这就是为什么您觉得它不是同步的。
-(void)jsCompleted{
    //Do stuff after javascript has completed