为什么不能使用jscontext ?当js调用location.reload()时,将setObject转换为UIWeb
Why can't use JSConext.setObject to UIWebView when js called location.reload() ?
我曾经用Swift写过一个ios应用当我想使用js调用Swift的对象和函数在UIWebView,它出现了一些bug。如下是我的代码:
//a demo class that I want to export to UIWebView;
//this object also was
@objc protocol NavObj : JSExport{
//any code here
static func callMe() -> String;
}
@objc class NavObj : NSObject, NavObj{
class func callMe() -> String{
return "called me";
}
}
class someView : UIViewController , UIWebViewDelegate{
pubic func webView(
webView : UIWebView,
shouldStartLoadWithRquest request : NSURLRequest,
navigationType : UIWebViewNavigationType
) -> Bool {
//get the JSContext
var jsContext = webView.valueForKeyPath("documentView.webView.mainFrame.javaScriptContext") as! JSContext ;
//and then set NavObj to UIWebView
jsContext.setObject( NavObj.self , "NavObj" );
}
}
在UIWebView代码中,像这样:
<script type='text/javascript'>
//get a test
var ret = NavObj.callMe();
console.log(ret);
//When first time to run this code was successed
//But when use js's location.reload to refresh this page , it appear an error:
//NavObj was not defined.
location.reload();
</script>
第一次加载网页成功。但是当使用js的位置。重新加载以刷新此页面,出现错误:未定义NavObj。
意味着我的swift代码
jsContext.setObject( NavObj.self , "NavObj" );
没有工作。
有办法修复这个错误吗?
这很可能是时间问题。当您导航到一个页面或重新加载该页面时,JSContext将被释放并创建一个新的。页面的JSContext是在页面加载时创建的,但是没有办法知道它何时发生。
我发现最可靠的方法是使用webViewDidFinishLoad
方法将事物注入JSContext,然后在完成时触发DOM事件。在网页中,你需要在使用本机对象之前等待该事件。
我也有同样的问题。
对象必须在webView完成加载时设置。
这一行jsContext.setObject( NavObj.self , "NavObj" );
移到webViewdidFinishLoad:{}
希望能帮到你