1:现有组件简单介绍
目前已封装的组件有:
NJCSUIView
NJCSUILabel
NJCSUIIconLabel
NJCSUITextField
NJCSUIButton
NJCSUITableView
NJCSUITableViewCell
……
对于已封装组件的使用有两种情况,使用方法也是不同的,下面会逐一介绍:
1-1:有与原生封装组件对应的JS组件
defineClass("NJCSUILabel: NJCSUIView", { }); defineClass("NJCSUIButton: NJCSUIView", { }); defineClass("NJCSUIIconLabel: NJCSUIView", { }); defineClass("NJCSUIImageView: NJCSUIView", { }); defineClass("NJCSUIWebView: NJCSUIView", { }); defineClass("NJCSUITableView: NJCSUIView", { }); defineClass("NJCSUITextField: NJCSUIView", { }); defineClass("NJCSUISubView: NJCSUIView", {}, { create:function(targetViewClass, instanceName, props){ var instance = new this(); instance.className = this.className; instance.instanceName = instanceName; instance.targetViewClass = targetViewClass; return instance; } });
示例代码:
var tableView = NJCSUITableView.create("tableView");//创建实例 this.addElement(tableView);//将示例添加到ViewController中的view内,addElement在被调用的时候才会在Native中创建一个与之对应的Native对象实例,所以只有调用addElement之后,才能调用该实例的方法,否则会因找不到对象而产生异常 tableView.setFrame(NJCSCGRect.create(0, 0, NJCSMacors["mainScreenWidth"], NJCSMacors["screenHeight"] - 50)); tableView.setBackgroundColor(NJCSUIColor_JS.create("#999999:0"));1-2:只有Native对象而没有与之对应的js对象 示例代码:
var UITableView = getNativeClassWithClassName("UITableView");//根据字符串获取UITableView类 var tableView = UITableView.alloc().init();//初始化UITableView实例 this.view().addSubView(tableView);//获取当前viewController的view 并添加tableView tableView.setFrame(NJCSCGRect.create(0, 0, NJCSMacors["mainScreenWidth"], NJCSMacors["screenHeight"] - 50));//设置tableView的frame tableView.setBackgroundColor(NJCSUIColor_JS.create("#999999:0"));//设置tableView的背景颜色看到这里可能会有人问,既然不封装就能直接使用干嘛要封装一层的,目的何在? 的确所有的组件只要Native内存在的,在js内是可以直接使用的,之所以要封装一层目的是为了在频繁操作某个对象的属性时(如:频繁设置UILabel实例的frame /text/backgroundColer……),减少JS和Native的通信次数,这里先简单提一下,后续在介绍“簇调用”时详细介绍。 2:组件封装 .h文件如下:
#import "NJCSUIView.h" @interface NJCSUILabel : NJCSUIView @property (nonatomic, strong) UILabel *label; @end
.m文件如下:
#import "NJCSUILabel.h" #import "UIColor+NJCS.h" @implementation NJCSUILabel - (instancetype)init { if (self = [super init]) { \_label = [[UILabel alloc] init]; self.targetView = _label; [self addSubview:_label]; } return self; } - (void)setNumberOfLines:(NSString *)lineNumber { [_label setLineBreakMode:NSLineBreakByCharWrapping]; [_label setNumberOfLines:[lineNumber integerValue]]; } - (void)setText:(NSString *)text { [_label setText:text]; } - (void)setBackgroundColor:(UIColor *)backgroundColor { [_label setBackgroundColor:backgroundColor]; } - (void)setTextAlignment:(NSString *)textAlignment { [_label setTextAlignment:[textAlignment intValue]]; } - (void)setTextColor:(UIColor *)textColor { [_label setTextColor:textColor]; } - (void)setFont:(UIFont *)fontValue { [_label setFont:fontValue]; } - (void)setDefaultValue:(NSString *)defaultValue { super.defaultValue = defaultValue; _label.text = defaultValue; } @end
从代码可以看出,Native组件的封装并没有什么特殊之处,只是用过组合的方式将UILabel作为NJCSUIView子类的属性而已,常用的方法也进行了简单封装(其实这也方法也是可以不封装的,后续将实现原理的时候会详细介绍)
与NJCSUILabel对应的JS组件封装就更加简单了代码如下:
defineClass(“NJCSUILabel: NJCSUIView”, {
});
定义了一个继承与NJCSUIView的类NJCSUILabel(这个类是JSContext内部的类,和OC的是不同的)。
关于defineClass方法的使用请参看JS类的定义;