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