篆体字网 > 知识库

jspatch

来源:篆体字网 2024-01-06 16:06:34 作者:篆字君

1. require

在使用Objective-C类之前需要调用 :

require('UIView')var view = UIView.alloc().init()

可以用逗号 分隔,一次性导入多个类:

require('UIView, UIColor')var view = UIView.alloc().init()var red = UIColor.redColor()

或者直接在使用时才调用 :

require('UIView').alloc().init()

2. 调用OC方法

调用类方法

var redColor = UIColor.redColor();

调用实例方法

var view = UIView.alloc().init();view.setNeedsLayout();

参数传递

跟在OC一样传递参数:

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. 特殊类型

Struct

JSPatch原生支持 CGRect / CGPoint / CGSize / NSRange 这四个 struct 类型,用 JS 对象表示:

// Obj-CUIView *view=[[UIView alloc] initWithFrame:CGRectMake(20, 20, 100, 100)];[view setCenter:CGPointMake(10,10)];[view sizeThatFits:CGSizeMake(100, 100)];CGFloat x=view.frame.origin.x;NSRange range=NSMakeRange(0, 1);

// JSvar view = UIView.alloc().initWithFrame({x:20, y:20, Width<span>:100, Height<span>:100})view.setCenter({x: 10, y: 10})view.sizeThatFits({Width<span>: 100, Height<span>:100})var x = view.frame().xvar range = {location: 0, length: 1}

其他 Struct 类型的支持请参照 添加 struct 类型支持

Selector

在JS使用字符串代表 Selector:

//Obj-C[self performSelector:@selector(viewWillAppear:) withObject:@(YES)];

//JSself.performSelector_withObject("viewWillAppear:", 1)

nil

JS 上的 和 都代表 OC 的 ,如果要表示 , 用 代替:

//Obj-C@implemention JPTestObject+ (BOOL)testNull(NSNull *null) { return [null isKindOfClass:[NSNull class]]}@end

//JSrequire('JPTestObject').testNull(nsnull) //return 1require('JPTestObject').testNull(null) //return 0

4. NSArray / NSString / NSDictionary

NSArray / NSString / NSDictionary 不会自动转成对应的JS类型,像普通 NSObject 一样使用它们:

//Obj-C@implementation JPObject+ (NSArray *)data{ return @[[NSMutableString stringWithString:@"JS"]]}+ (NSMutableDictionary *)dict{ return [[NSMutableDictionary alloc] init];}@end

// JSrequire('JPObject')var ocStr = JPObject.data().objectAtIndex(0)ocStr.appendString("Patch")var dict = JPObject.dict()dict.setObject_forKey(ocStr, 'name')console.log(dict.objectForKey('name')) //output: JSPatch

如果要把 NSArray / NSString / NSDictionary 转为对应的 JS 类型,使用 接口:

// JSvar data = require('JPObject').data().toJS()//data instanceof Array===truedata.push("Patch")var dict = JPObject.dict()dict.setObject_forKey(data.join(''), 'name')dict.toJS()console.log(dict['name']) //output: JSPatch

5. Block

当要把 JS 函数作为 block 参数给 OC时,需要先使用 接口包装:

// Obj-C@implementation JPObject+ (void)request:(void(^)(NSString *content, BOOL success))callback{ callback(@"I'm content", YES);}@end

从 OC 返回给 JS 的 block,直接调用即可:

// Obj-C@implementation JPObjecttypedef void (^JSBlock)(NSDictionary *dict);+ (JSBlock)genBlock{ NSString *ctn=@"JSPatch"; JSBlock block=^(NSDictionary *dict) { NSLog(@"I'm %@, version: %@", ctn, dict[@"v"]) }; return block;}@end

// JSvar blk = require('JPObject').genBlock();blk({v: "0.0.1"}); //output: I'm JSPatch, version: 0.0.1

在 block 里无法使用 变量,需要在进入 block 之前使用临时变量保存它:

defineClass("JPViewController", { viewDidLoad: function() { var slf = self; require("JPTestObject").callBlock(block(function(){ //`self` is not available here, use `slf` instead. slf.doSomething(); }); }}

从 JS 传 block 到 OC,有两个限制:

A. block 参数个数最多支持4个。(若需要支持更多,可以修改源码)
B. block 参数

上一篇:ipad2与ipad3的区别

下一篇:e-mail营销

相关阅读