美文网首页
OC 与JS之多参数形式交互

OC 与JS之多参数形式交互

作者: 你买票吗 | 来源:发表于2019-03-17 13:48 被阅读0次

随着H5的出现,以及一些前端框架的出现,原生开发难免会和H5进行混合开发,那么如果在OC中的方法是多参数形式的,JS里面应该如何调用呢。

接下来让我用一个Demo为大家解读

首先我们在控制器中完成webview 的加载和模拟执行JS方法的操作

ViewController.h中的代码

#import <UIKit/UIKit.h>

@interface ViewController : UIViewController


@end

ViewController.m中的代码

#import "ViewController.h"
#import "TestJSObject.h"

@interface ViewController ()<UIWebViewDelegate>
@property(nonatomic,strong)UIWebView* webView;
@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    
    
    self.webView=[[UIWebView alloc]initWithFrame:self.view.bounds];
    self.webView.delegate=self;
    [self.webView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@"http://www.baidu.com"]]];
    [self.view addSubview:self.webView];
    
}

-(void)webViewDidFinishLoad:(UIWebView *)webView
{
    //网页加载完成调用此方法
    
    //首先创建JSContext 对象(此处通过当前webView的键获取到jscontext)
    JSContext *context=[webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];
    
    //第二种情况,js是通过对象调用的,我们假设js里面有一个对象 testobject 在调用方法
    //首先创建我们新建类的对象,将他赋值给js的对象
    
    TestJSObject *testJO=[TestJSObject new];
    context[@"testobject"]=testJO;
    
    //同样我们也用刚才的方式模拟一下js调用方法
    NSString *jsStr1=@"testobject.TestNOParameter()";
    [context evaluateScript:jsStr1];
    NSString *jsStr2=@"testobject.TestOneParameter('参数1')";
    [context evaluateScript:jsStr2];
    NSString *jsStr3=@"testobject.TestTowParameterSecondParameter('参数A','参数B')";
    [context evaluateScript:jsStr3];
    
}


@end

我们定义的实体类

###TestJSObject.h 代码如下:
#import <Foundation/Foundation.h>
#import <JavaScriptCore/JavaScriptCore.h>

//首先创建一个实现了JSExport协议的协议
@protocol TestJSObjectProtocol <JSExport>

//此处我们测试几种参数的情况
-(void)TestNOParameter;
-(void)TestOneParameter:(NSString *)message;
-(void)TestTowParameter:(NSString *)message1 SecondParameter:(NSString *)message2;

@end

//让我们创建的类实现上边的协议
@interface TestJSObject : NSObject<TestJSObjectProtocol>

@end

TestJSObject.m 中的代码

#import "TestJSObject.h"

@implementation TestJSObject

//一下方法都是只是打了个log 等会看log 以及参数能对上就说明js调用了此处的iOS 原生方法
-(void)TestNOParameter
{
    NSLog(@"this is ios TestNOParameter");
}
-(void)TestOneParameter:(NSString *)message
{
    NSLog(@"this is ios TestOneParameter=%@",message);
}
-(void)TestTowParameter:(NSString *)message1 SecondParameter:(NSString *)message2
{
    NSLog(@"this is ios TestTowParameter=%@  Second=%@",message1,message2);
}
@end

Demo文件结构

image.png

运行结果:

image.png

以上可以看到这种形式可以获取到JS里面传递过来的参数,并且能够制定到OC中的方法

注意:JS 中调用的JS 方法名称:testobject.TestTowParameterSecondParameter('参数A','参数B') 刚好是我们代理方法

-(void)TestTowParameter:(NSString *)message1 SecondParameter:(NSString *)message2

中的 TestTowParameter 和 SecondParameter 拼接起来的名称。

下面是Demo地址:https://github.com/TT-struggleofoneself/OB_JS_interactive.git

相关文章

网友评论

      本文标题:OC 与JS之多参数形式交互

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