iOS Developer

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

2016-10-27  本文已影响50人  简鱼7819

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

     }

})

上一篇下一篇

猜你喜欢

热点阅读