JSPatch 学习二 -- 基础用法(1)

想要运用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)

     }

})

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 193,968评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,682评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,254评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,074评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 60,964评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,055评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,484评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,170评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,433评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,512评论 2 308
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,296评论 1 325
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,184评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,545评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,880评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,150评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,437评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,630评论 2 335

推荐阅读更多精彩内容