美文网首页iOS Developer
JSPatch 学习二 -- 基础用法(1)

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

作者: 简鱼7819 | 来源:发表于2016-10-27 11:24 被阅读50次

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

         }

    })

    相关文章

      网友评论

        本文标题:JSPatch 学习二 -- 基础用法(1)

        本文链接:https://www.haomeiwen.com/subject/zdbjuttx.html