我已经用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事件。在网页中,您需要先等待该事件,然后才能使用本机对象。

09-17 22:24