-
Notifications
You must be signed in to change notification settings - Fork 110
基础用法
在使用Objective-C类之前需要调用 _import('className’)
:
_import('UIView')
var view = UIView.alloc().init()
可以用逗号 ,
分隔,一次性导入多个类:
_import('UIView, UIColor')
var view = UIView.alloc().init()
var red = UIColor.redColor()
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)
声明和静态方法平级
data: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()
defineClass(classDeclaration, instanceMethods, classMethods)
@param classDeclaration
: 字符串,类名/父类名和Protocol
@param instanceMethods
: 要添加或覆盖的实例方法
@param classMethods
: 要添加或覆盖的类方法
1.在 defineClass 里定义 OC 已存在的方法即可覆盖,方法名规则与调用规则一样,使用 _
分隔:
// OC
@implementation JPTableViewController
- (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.在方法名前加 tt
即可调用未覆盖前的 OC 原方法:
// OC
@implementation JPTableViewController
- (void)viewDidLoad {
}
@end
// JS
defineClass("JPTableViewController", {
viewDidLoad: function() {
self.ttviewDidLoad();
},
})
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()
接口代表 super 关键字,调用 super 方法:
// JS
defineClass("JPTableViewController", {
viewDidLoad: function() {
Super().viewDidLoad();
}
})
用调用 getter / setter 的方式获取/修改已在 OC 定义的 Property:
可以在 name:property() 为属性
defineClass("JPTableViewController", {
//添加属性
name:property()
init: function() {
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 member variables
self.setValue_forKey_(["Patch"], "_data") //set member variables
},
})
可以给一个类随意添加 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]: ""
}
})
支持 CGRect / CGPoint / CGSize / UIEdgeInsets 这四个 struct 类型,用 JS 对象表示:
// Obj-C
UIView *view = [[UIView alloc] initWithFrame:CGRectMake(20, 20, 100, 100)];
[view setCenter:CGPointMake(10,10)];
[view sizeThatFits:CGSizeMake(100, 100)];
// JS
var view = UIView.alloc().initWithFrame(new TTReact(x:20, y:20, width:100, height:100))
view.setCenter(new TTPoint(x: 10, y: 10))
view.sizeThatFits(new TTSize(width: 100, height:100))
在JS使用字符串代表 Selector:
//Obj-C
[self performSelector:@selector(viewWillAppear:) withObject:@(YES)];
//JS
self.performSelector_withObject_("viewWillAppear:", 1)
目前支持3中级别日志
Utils.log
只会在debug
环境下的js中输出
Utils.log_info
在js 和 xcode中输出
Utils.log_error
在js 和 xcode中输出,并输出error信息
log不支持多参数,只支持参数拼接
var view = UIView.alloc().init();
var str = "test";
var num = 1;
Utils.log(str + num); //直接在JS拼接字符串
也可以通过 Safari 的调试工具对 JS 进行断点调试,详见 JS 断点调试