iOS中使用JSPatch框架使Objective-C与JavaScript代码交互

2020-01-15 15:53:45王振洲

四、JavaScript与Objective-C交互的几种常用类型

1.结构体

在Objective-C代码中,我们经常会使用到结构体,JSPatch中原生支持的结构体有如下几种:CGPoint,CGSize,CGRect,NSRange。并且这几种结构体在进行界面操作时也会经常使用到。

对于CGRect类型,JavaScript使用如下代码创建:


  var view = require('UIView').alloc().init()
  view.setFrame({x:100,y:100,width:100,height:100})

对于CGPoint类型,JavaScript使用如下代码创建:

   


view.setCenter({x:200,y:200})

对于CGSize类型,JavaScript使用如下代码创建:


  var size = {width:200,height:200}
  view.setFrame({x:100,y:100,width:size.width,height:size.height})

对于NSRange类型,JavaScript使用如下代码创建:


  var range = {location: 0, length: 1}

2.选择器Selector

对于Objective-C中的方法选择器Selector,在JavaScript中使用字符串的形式创建,例如:


self.performSelector_withObject("func:", 1)

3.关于空对象

在JavaScript中,null与undefined都对应于Objective-C中的nil,Objective-C中的NSNull空对象,在JavaScript中使用nsnull来代替。

4.在Objective-C与JavaScript中进行block的交互

在JavaScript与Objective-C进行block交互有两种方式,一种是在JavaScript文件中调用Objective-C中的block,一种是将JavaScript文件中的函数块作为block参数传递给Objective-C。

在JavaScript文件中使用Objective-C中的block十分简单,因为JavaScript中没有block的概念,Objective-C会被自动转换为函数,示例如下:

Objective-C:


typedef void(^block)(NSString * str);
@interface ViewController ()
@end
@implementation ViewController
-(block)getBlock{
  block block = ^(NSString * str){NSLog(@"%@",str);};
  return block;
}
@end

JavaScript:


defineClass("ViewController", {
      viewDidAppear: function(animated) {
       var func = self.getBlock()
        func("123")
      }
      })

在JavaScript文件中将func作为参数block传递给Objective-C就复杂一些,需要使用block()方法进行包装,例如:

Objective-C:


@interface ViewController ()
@end
@implementation ViewController

-(void)run:(void(^)(NSString * str))block{
  block(@"123");
}
@end

JavaScript:


defineClass("ViewController", {
      viewDidAppear: function(animated) {
      //run 方法中需要传入一个block
      self.run(block("NSString*",function(str){console.log(str)}))
      }
      })