想要运用JSPatch这个框架,必须了解知晓的基础!!!
学习原文https://github.com/bang590/JSPatch/wiki/JSPatch-基础用法#super
1,require
在使用Objective-C类之前需要调用require('className’),可以用逗号,分割,一次性导入多各类,或者直接在使用时才调用require('className’)
require('UIView')
var view = UIView.alloc().init()
require('UIView, UIColor')
require('UIView').alloc().init()
例:(1)var alertView =require('UIAlertView').alloc().initWithTitle_message_delegate_cancelButtonTitle_otherButtonTitles("Alert",self.dataSource()[indexPath.row()], self, "OK", null);
alertView.show()
(2)cell = require('UITableViewCell').alloc().initWithStyle_reuseIdentifier(0, "cell")
2,调用OC方法
调用类方法:var redColor = UIColor.redColor();
调用实例方法:
var view = UIView.alloc().init();
view.setNeedsLayout();
参数传递,跟在OC一样传递参数:
var view = UIView.alloc().init();
var superView = UIView.alloc().init()
superView.addSubview(view)
Property
获取/修改 Property 等于调用这个 Property 的 getter / setter 方法,获取时记得加 ():
view.setBackgroundColor(redColor);
var bgColor = view.backgroundColor();
方法名转换,多参数方法名使用 _ 分隔:
var indexPath = require('NSIndexPath').indexPathForRow_inSection(0, 1);
若原 OC 方法名里包含下划线 _,在 JS 使用双下划线 __ 代替:
// Obj-C: [JPObject _privateMethod];
JPObject.__privateMethod()
3,自己定义类defineClass
API
defineClass(classDeclaration, [properties,] instanceMethods, classMethods)
@param classDeclaration: 字符串,类名/父类名和Protocol
@param properties: 新增property,字符串数组,可省略
@param instanceMethods: 要添加或覆盖的实例方法
@param classMethods: 要添加或覆盖的类方法
// OC
@implementation JPTestObject
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{}
@end
// JS
defineClass("JPTableViewController", {tableView_didSelectRowAtIndexPath: function(tableView, indexPath) {...},})
2.使用双下划线 __ 代表原OC方法名里的下划线 _ :
// OC
@implementation JPTableViewController
- (NSArray *) _dataSource {}
@end
// JS
defineClass("JPTableViewController", {
__dataSource: function() {},})
3.在方法名前加 ORIG 即可调用未覆盖前的 OC 原方法:
// OC
@implementation JPTableViewController
- (void)viewDidLoad {}
@end
// JS
defineClass("JPTableViewController", {viewDidLoad: function() {self.ORIGviewDidLoad();},})
覆盖类方法
defineClass() 第三个参数就是要添加或覆盖的类方法,规则与上述覆盖实例方法一致:
// OC
@implementation JPTestObject
+ (void)shareInstance{}
@end
// JS
defineClass("JPTableViewController", {//实例方法}, {//类方法shareInstance: function() {...},})
覆盖 Category 方法与覆盖普通方法一样:
@implementation UIView (custom)
- (void)methodA {}
+ (void)clsMethodB {}
@end
defineClass('UIView', {methodA: function() {}}, {clsMethodB: function() {}});
Super:使用 self.super() 接口代表 super 关键字,调用 super 方法:
// JS
defineClass("JPTableViewController", {viewDidLoad: function() {
self.super().viewDidLoad();
}})
Property:获取/修改 OC 定义的 Property,用调用 getter / setter 的方式获取/修改已在 OC 定义的 Property
// OC
@interface JPTableViewController
@property (nonatomic) NSArray *data;
@property (nonatomic) NSString *shareURL;
@property (nonatomic) NSString *shareTitle;
@end
@implementation JPTableViewController
@end
// JS
defineClass("JPTableViewController", {
viewDidLoad: function() {
var data = self.data(); //get property value
self.setData(data.toJS().push("JSPatch")); //set property value
var sel = self;
self.bridge().registerHandler_handler('h5ToNativeShareDialog', block('NSDictionary *',function(data,responseCallback) {
sel.setShareURL(data.objectForKey('url'));
sel.setShareTitle(data.objectForKey('title'));
}));
})
动态新增 Property,可以在 defineClass() 第二个参数为类新增 property,格式为字符串数组,使用时与 OC property 接口一致:
defineClass("JPTableViewController", ['data', 'totalCount'], {
init: function() {
self = self.super().init()
self.setData(["a", "b"]) //添加新的 Property (id data)
self.setTotalCount(2)
return self
},
viewDidLoad: function() {
var data = self.data() //获取 Property 值
var totalCount = self.totalCount()
},
})
私有成员变量,使用 valueForKey() 和 setValue_forKey() 获取/修改私有成员变量:
// OC
@implementation JPTableViewController {
NSArray *_data;
}
@end
// JS
defineClass("JPTableViewController", {
viewDidLoad: function() {
var data = self.valueForKey("_data") //get
self.setValue_forKey(["JSPatch"], "_data") //set
},
})
添加新方法,可以给一个类随意添加 OC 未定义的方法,但所有的参数类型都是 id:
// OC
@implementation JPTableViewController
- (void)viewDidLoad
{
NSString* data = [self dataAtIndex:@(1)];
NSLog(@"%@", data); //output: Patch
}
@end
// JS
var data = ["JS", "Patch"]
defineClass("JPTableViewController", {
dataAtIndex: function(idx) {
return idx < data.length ? data[idx]: ""
}
})
Protocol,可以在定义时让一个类实现某些 Protocol 接口,写法跟 OC 一样:
defineClass("JPViewController: UIViewController<UIScrollViewDelegate,UITextViewDelegate>", {})
这样做的作用是,当添加 Protocol 里定义的方法,而类里没有实现的方法时,参数类型不再全是 id,而是自动转为 Protocol 里定义的类型:
//OC
@protocol UIAlertViewDelegate<NSObject>
- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex;
@endde
//JS
fineClass("JPViewController: UIViewController<UIAlertViewDelegate>", {
viewDidAppear: function(animated) {
var alertView = require('UIAlertView')
.alloc()
.initWithTitle_message_delegate_cancelButtonTitle_otherButtonTitles(
"Alert",
self.dataSource().objectAtIndex(indexPath.row()),
self,
"OK",
null
)
alertView.show()
}
alertView_clickedButtonAtIndex: function(alertView, buttonIndex) {
console.log('clicked index ' + buttonIndex)
}
})
网友评论