JSPatch是GitHub上一个开源的框架,其可以通过Objective-C的run-time机制动态的使用JavaScript调用与替换项目中的Objective-C属性与方法。其框架小巧,代码简洁,并且通过系统的JavaScriptCore框架与Objective-C进行交互,这使其在安全性和审核风险上都有很强的优势。Git源码地址:https://github.com/bang590/JSPatch。
引入#import "JPEngine.h"
增加 libz.1.tbd , JavaScriptCore.framework
实现
[JPEngine startEngine];
NSString *sourcePath = [[NSBundle mainBundle] pathForResource:@"demo" ofType:@"js"];
NSString *script = [NSString stringWithContentsOfFile:sourcePath encoding:NSUTF8StringEncoding error:nil];
[JPEngine evaluateScript:script];
这样第一句你就已经完成了,下面看一下js 里面怎么写吧
1,添加按钮
var btn = require('UIButton').alloc().initWithFrame({x:0, y:100, width:100, height:100});
btn.setTitle_forState('lalala',0);
btn.addTarget_action_forControlEvents(self,"btnClicked",1<<6);
btn.setBackgroundColor(UIColor.blueColor());
self.view().addSubview(btw);
btnClicked: function() {
console.log('asasasa')
},
2,添加试图
var xView = UIView.alloc().init();
xView.setFrame({x:100, y:300, width:100, height:100});
xView.setBackgroundColor(UIColor.redColor());
self.view().addSubview(xView);
3,重写方法
initUIOne: function() {
var oneLabel = UILabel.alloc().initWithFrame({x:50, y:350, width:100, height:100});
oneLabel.setBackgroundColor(UIColor.purpleColor());
oneLabel.setText("99999");
self.view().addSubview(oneLabel);
},
4,重写类方法
defineClass('CollectionHight',{
},{
cellHeightcontent_cover: function(content, cover) {
return 1200;
}
})
5,获取私有变量
var rowMutAry = self.valueForKey("rowMutAry")
6,返回数组
return rowMutAry.count();
也许作者也觉得毕竟这个JSPatch语法 并不是一个正式的语种,大家不会投入太大的精力来仔细学习,所以作者本人也提供了一个简单粗暴的OC到JS直接转换地址: http://bang590.github.io/JSPatchConvertor/
但是可悲的是里面有的语法是错的..不过很多事可以借鉴的,改改就是对的了