当js调用location.reload()时,为什么不能将JSConext.setObject用于UIWebView?

时间:2015-06-04 09:48:44

标签: javascript swift uiwebview javascriptcore

我用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" );

没有用。

有没有办法解决这个错误?

2 个答案:

答案 0 :(得分:0)

这很可能是一个时间问题。当您导航到页面或重新加载页面时,JSContext将被释放并创建一个新的。页面的JSContext是在页面加载时创建的,但是没有办法确切知道何时发生。

我发现最可靠的方法是使用webViewDidFinishLoad方法将内容注入JSContext,然后在完成后触发DOM事件。在网页中,您需要在使用本机对象之前等待该事件。

答案 1 :(得分:0)

我有同样的问题。

webView完成加载后必须设置对象。

此行jsContext.setObject( NavObj.self , "NavObj" );进入webViewdidFinishLoad:{}

希望可以帮到你