随着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
网友评论