UIWebView's
-stringByEvaluatingJavaScript(from:)
同步返回一个String?
值。
与WKWebView
等效的evaluateJavaScript(_:completionHandler:)
与complitionHandler一起使用。
我正在使用遗留代码,并且stringByEvaluatingJavaScript(from:)
影响着代码中的数千行,可以在随处可见的许多返回值的函数中找到(不使用块)。
非常简单的示例-
@discardableResult func js(_ script: String) -> String? {
let callback = self.stringByEvaluatingJavaScript(from: script)
if callback!.isEmpty { return nil }
return callback
}
现在我要更改为evaluateJavaScript(_:completionHandler:)
,我将需要使用一个块来处理js(script:)
方法,并且需要更改使用该方法的方法,依此类推...
我认为为了在不更改所有代码的情况下解决此问题,我需要evaluateJavaScript(_:completionHandler:)
来同步返回String?
。
有人知道如何实现吗?或有其他解决方案?
答案 0 :(得分:0)
找到了-
将其添加到WKWebview扩展中,将evaluateJavaScript(_:completionHandler:)
包装在UIWebview
-
open func stringByEvaluatingJavaScript(from script: String) -> String?
{
var finished = false
var stringResult: String? = nil
evaluateJavaScript(script) { (result, error) in
if error == nil, let result = result
{
stringResult = String(describing: result)
}
finished = true
}
while !finished
{
RunLoop.current.run(mode: .default, before: Date.distantFuture)
}
return stringResult
}
我不确定result
中可以返回什么类型,所以请当心。否则效果很好。