我用Swift编写了一个ios应用程序 当我想在UIWebView中使用js调用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" );
没有用。
有没有办法解决这个错误?
答案 0 :(得分:0)
这很可能是一个时间问题。当您导航到页面或重新加载页面时,JSContext将被释放并创建一个新的。页面的JSContext是在页面加载时创建的,但是没有办法确切知道何时发生。
我发现最可靠的方法是使用webViewDidFinishLoad
方法将内容注入JSContext,然后在完成后触发DOM事件。在网页中,您需要在使用本机对象之前等待该事件。
答案 1 :(得分:0)
我有同样的问题。
webView完成加载后必须设置对象。
此行jsContext.setObject( NavObj.self , "NavObj" );
进入webViewdidFinishLoad:{}
希望可以帮到你