日常收集

JSPatch写webView遇到的问题

2016-11-29  本文已影响81人  BestJoker

发现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("加载完成");
             },
             
             },{
             
             });
上一篇下一篇

猜你喜欢

热点阅读