上篇文章中讲述了如何通过代码直接用JavaScript调用Objective-C方法,本文通过另一种思路实现,即通过稍微复杂的一种方法,即通过一个对象来调用方法,该方法通过实现一个协议来操作,即JSExport协议
JSEXport,凡是添加了JSEXPort协议的协议,所规定的方法,变量等,就会对JS开放,我们都可以通过JS的类调用到。
比如:JS方法为account.account('参数'),我们在OC中添加的代理方法为:-(void)account:(nsstring *)account;
如果js是多个参数的话 我们代理方法的所有变量前的名字连起来要和js的方法名字一样,
例如: js方法为 :testobject.TestTowParameterSecondParameter('参数A','参数B')
他有两个参数 那么我们的代理方法 就是把js的方法名 TestTowParameterSecondParameter 任意拆分成两段作为代理方法名(此处我们拆分为 TestTowParameter 和 SecondParameter ) 那么我们的代理方法就是
-(void)TestTowParameter:(NSString *)message1 SecondParameter:(NSString *)message2;
我们看代理方法有两个变量别名
TestTowParameter 和 SecondParameter
他两个拼接起来就刚好是我们js的方法名,这部分是参考别人博客看的功能,没有实际操作,读者若有需要,可以自己尝试下。
下边详细讲述下操作
1:首先创建一个类,继承与NSObject,规定一个协议,在该类中导入头文件#import <JavaScriptCore/JavaScriptCore.h>
1.1:创建协议
#import <JavaScriptCore/JavaScriptCore.h>
/ /首先创建一个实现了JSExport协议的协议
@protocol JSObjectProtocol <JSExport>
//此处我们测试几种参数的情况
-(void)JSNOParamr;
-(void)JSOneParameter:(NSString *)message;
-(void)JSTwoParameter:(NSString *)message1 SecondParameter:(NSString *)message2;
@end
//让我们创建的类实现上边的协议
@interface TestJSObject : NSObject<JSObjectProtocol>
@end
.m文件为对应的实现
2:具体的调用
还是和之前的一样,首先创建JSContext对象:
JSContext *context=[webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];
js是通过对象调用的,我们假设js里面有一个对象 jsCallOC在调用方法
首先创建我们新建类的对象,将他赋值给js的对象
JSObjectProtocol * ocJs = [[JSObjectProtocol alloc]init];
context[@"jsCallOC"] = ocJS//该处代码将我们自己实现了协议的类的对象赋值给js的类,让js的类通过方法调用,
这个时候可以执行js的代码了,js中的对象名字要和该名称相同,不然没法调用,这个时候在oc的类中打断点,会发现掉用来该方法,如是,则实现了另外一种JavaScript调用Objective-C的方法