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