美文网首页日常收集
JSPatch写webView遇到的问题

JSPatch写webView遇到的问题

作者: BestJoker | 来源:发表于2016-11-29 18:18 被阅读81次

    发现JSPatch写webView有很多问题
    1.正常应该补充"SecondViewController : UIViewController<UIWebViewDelegate>",但是已补充上就崩溃,看到说是JSPatch是单线程的原因,与webView初始化冲突,但是依然没有找到解决方式.
    2.使用webView,无论使用loadRequest方法和loadHTMLString_baseURL方法都加载出来的是对应网站的所有代码,包括header和css,而不是显示的样式.

    require('NSURL,NSURLRequest,UIWebView,NSString,UIColor');
    defineClass("SecondViewController : UIViewController",['webView'],
                {
                viewDidLoad: function()
                {
                self.super().viewDidLoad();
                self.view().setBackgroundColor(UIColor.whiteColor());
                var htmlstr = NSString.alloc().initWithContentsOfURL_encoding_error(NSURL.URLWithString("http://www.baidu.com"), 4, null);
                self.setWebView(UIWebView.alloc().initWithFrame({x:0,y:0,width:self.view().frame().width,height:self.view().frame().height}));
                //            self.webView().scrollView().setContentInset(UIEdgeInsetsMake(0, 0, 64, 0));
                self.webView().scrollView().setBackgroundColor(UIColor.whiteColor());
                self.webView().setDelegate(self);
                self.webView().setScalesPageToFit(YES);
                self.webView().loadHTMLString_baseURL(htmlstr, null);
                self.view().addSubview(self.webView());
                console.log("666");
                },
                webViewDidFinishLoad: function(webView)
                {
                 var title =  webView.stringByEvaluatingJavaScriptFromString("document.title");
                 self.navigationItem().setTitle(title);
                console.log(webView);
                console.log("加载完成");
                },
                
                },
                {
                //类方法
                });
    

    在研究了文档之后,发现解决方法
    https://github.com/bang590/JSPatch/wiki/performSelectorInOC-使用文档#uiwebview例子
    具体performSelectorInOC的描述请前往这里去查看.我只说一下webView的事情.

    UIWebView例子

    JSPatch 和 UIWebView 都使用了 JavaScriptCore,在 JSPatch 里第一次初始化 UIWebView (在原生 OC 代码没有初始化过 UIWebView),就会出现 JavaScriptCore 冲突的问题,导致意想不到的结果。遇到这个问题同样可以用 .performSelectorInOC 接口解决:

    defineClass("JPViewController", {
      viewDidLoad: function() { 
        var slf = self;
        return UIWebView.alloc().performSelectorInOC('initWithFrame:', [self.view().bounds()],function(webView){
            var url = NSURL.alloc().initWithString("http://www.apple.com");
            webView.loadRequest(NSURLRequest.requestWithURL(url));
            slf.view().addSubview(webView);
        });
      }
    }
    

    注意点
    只能在 defineClass() 的方法里使用。
    调用时必须 return,否则无法调用到。
    不需要引入UIWebviewDelegate,否则会导致崩溃,具体原因还未查明

    于是之前的代码就有了进一步的变化.

    require('NSURL,NSURLRequest,UIWebView,NSString,UIColor');
    defineClass ("SecondViewController : UIViewController",['webView'],{
                 viewDidLoad: function()
                 {
                 self.super().viewDidLoad();
                 self.view().setBackgroundColor(UIColor.whiteColor());
                 console.log("666");
                 var slf = self;//在block中不能使用self,进行处理.
                 //这里也可以不适用属性,会相对简单一些.
                 return UIWebView.alloc().performSelectorInOC('initWithFrame:', [self.view().bounds()],function(webView){
                                                              slf.setWebView(webView);
                                                              var url = NSURL.alloc().initWithString("http://www.baidu.com");
                                                              slf.webView().loadRequest(NSURLRequest.requestWithURL(url));
                                                              slf.webView().setDelegate(slf);
                                                              slf.webView().setScalesPageToFit(YES);
    
                                                              slf.view().addSubview(slf.webView());
                                                              });
                 },
                 webViewDidFinishLoad: function(webView)
                 {
                 var title = webView.stringByEvaluatingJavaScriptFromString("document.title");
                 self.navigationItem().setTitle(title);
                 console.log(webView);
                 console.log("加载完成");
                 },
                 
                 },{
                 
                 });
    

    相关文章

      网友评论

      本文标题:JSPatch写webView遇到的问题

      本文链接:https://www.haomeiwen.com/subject/vloapttx.html