美文网首页
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