我已经用Swift编写了一个iOS应用
当我想使用js在UIWebView中调用Swift的对象和函数时,
似乎有一些错误。
下面是我的代码:
//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的location.reload刷新此页面时,会出现错误:
NavObj未定义。
这意味着我的快速代码
jsContext.setObject( NavObj.self , "NavObj" );
没有工作。
有什么办法可以解决此错误?
最佳答案
这很可能是时间问题。当您导航到页面或重新加载页面时,将释放JSContext并创建一个新页面。页面的JSContext是在页面加载时创建的,但是无法确切知道何时发生。
我发现最可靠的方法是使用webViewDidFinishLoad
方法将事物注入JSContext,然后在完成后触发DOM事件。在网页中,您需要先等待该事件,然后才能使用本机对象。