【问题标题】:Tell when stringByEvaluatingJavaScriptFromString: has completed告诉 stringByEvaluatingJavaScriptFromString: 何时完成
【发布时间】:2015-05-22 15:22:35
【问题描述】:

我正在使用标准的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");
}

【问题讨论】:

  • 但是[UIWebView stringByEvaluatingJavaScriptFromString:] 是同步的,并且在评估所有javascript代码之前不会返回。也许您执行的代码会启动另一个异步任务(在 javascript 中),这就是您觉得它不同步的原因。

标签: javascript ios objective-c uiwebview


【解决方案1】:

好的,所以我想出了一个好方法来做到这一点。 在您的 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;

}

-(void)jsCompleted{
    //Do stuff after javascript has completed

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-11-24
    • 2020-07-11
    • 2015-02-04
    • 1970-01-01
    • 1970-01-01
    • 2013-05-25
    • 2016-10-10
    • 2021-04-15
    相关资源
    最近更新 更多