下来我们看第二种情况 就是js 中是通过一个对象来调用方法的。

此处稍微复杂一点我们需要使用到

JSExport

凡事添加了JSExport协议的协议,所规定的方法,变量等 就会对js开放,我们可以通过js调用到

如果js是一个参数或者没有参数的话 就比较简单,我们的方法名和js的方法名保持一致即可

比如: js方法为

  1. testobject.TestOneParameter('参数1')

那么 我们在oc中添加的代理方法就为

  1. -(void)TestOneParameter:(NSString *)message;

如果js是多个参数的话  我们代理方法的所有变量前的名字连起来要和js的方法名字一样

比如: js方法为

  1. testobject.TestTowParameterSecondParameter('参数A','参数B')

他有两个参数 那么我们的代理方法 就是把js的方法名 TestTowParameterSecondParameter 任意拆分成两段作为代理方法名(此处我们拆分为 TestTowParameter 和 SecondParameter ) 那么我们的代理方法就是

  1. -(void)TestTowParameter:(NSString *)message1 SecondParameter:(NSString *)message2;

我们看代理方法有两个变量别名

TestTowParameter 和 SecondParameter

他两个拼接起来就刚好是我们js的方法名

此处有点绕。我们直接看代码

首先创建一个类 继承NSObject 并且规定一个协议

  1. #import <Foundation/Foundation.h>
  2. #import <JavaScriptCore/JavaScriptCore.h>
  3. //首先创建一个实现了JSExport协议的协议
  4. @protocol TestJSObjectProtocol <JSExport>
  5. //此处我们测试几种参数的情况
  6. -(void)TestNOParameter;
  7. -(void)TestOneParameter:(NSString *)message;
  8. -(void)TestTowParameter:(NSString *)message1 SecondParameter:(NSString *)message2;
  9. @end
  10. //让我们创建的类实现上边的协议
  11. @interface TestJSObject : NSObject<TestJSObjectProtocol>
  12. @end

类的实现

  1. #import "TestJSObject.h"
  2. @implementation TestJSObject
  3. //一下方法都是只是打了个log 等会看log 以及参数能对上就说明js调用了此处的iOS 原生方法
  4. -(void)TestNOParameter
  5. {
  6. NSLog(@"this is ios TestNOParameter");
  7. }
  8. -(void)TestOneParameter:(NSString *)message
  9. {
  10. NSLog(@"this is ios TestOneParameter=%@",message);
  11. }
  12. -(void)TestTowParameter:(NSString *)message1 SecondParameter:(NSString *)message2
  13. {
  14. NSLog(@"this is ios TestTowParameter=%@  Second=%@",message1,message2);
  15. }
  16. @end

下面我们在weibview加载完成之后调用测试一下

代码如下:

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

结果如下图

好了 我们看到了结果 三个方法都调用了

ok两种方式都完成了

iOS js oc相互调用(JavaScriptCore)---js调用iOS --js里面通过对象调用方法的更多相关文章

  1. 转载 OS js oc相互调用(JavaScriptCore) ---js调用iOS ---js里面直接调用方法

    OS js oc相互调用(JavaScriptCore)   接着上节我们讲到的iOS调用js 下来我们使用js调用iOS js调用iOS分两种情况 一,js里面直接调用方法 二,js里面通过对象调用 ...

  2. 转载 iOS js oc相互调用(JavaScriptCore) --iOS调用js

    iOS js oc相互调用(JavaScriptCore)   从iOS7开始 苹果公布了JavaScriptCore.framework 它使得JS与OC的交互更加方便了. 下面我们就简单了解一下这 ...

  3. iOS js oc相互调用(JavaScriptCore)(二)

    下来我们使用js调用iOS js调用iOS分两种情况 一,js里面直接调用方法 二,js里面通过对象调用方法 首先我们看第一种,直接调用方法. 其中用到了iOS的block 上代码 -(void)we ...

  4. iOS js oc相互调用(JavaScriptCore 下)

    下来我们使用js调用iOS js调用iOS分两种情况 一,js里面直接调用方法 二,js里面通过对象调用方法 首先我们看第一种,直接调用方法. 其中用到了iOS的block 上代码 -(void)we ...

  5. iOS js oc相互调用JavaScriptCore(一)

    原址:http://blog.csdn.net/lwjok2007/article/details/47058101 1.普通调用 从iOS7开始 苹果公布了JavaScriptCore.framew ...

  6. iOS js oc相互调用(JavaScriptCore)

    http://blog.csdn.net/lwjok2007/article/details/47058795

  7. Js基础知识4-函数的三种创建、四种调用(及关于new function()的解释)

    在js中,函数本身属于对象的一种,因此可以定义.赋值,作为对象的属性或者成为其他函数的参数.函数名只是函数这个对象类的引用. 函数定义 // 函数的三种创建方法(定义方式) function one( ...

  8. iOS 阶段学习第25天笔记(iOS沙盒机制介绍)

    iOS学习(OC语言)知识点整理 一.iOS沙盒机制介绍 1)概念: 每个ios应用都有自己的应用沙盒,应用沙盒就是文件系统目录,与其他应用放入文件 系统隔离,ios系统不允许访问 其他应用的应用沙盒 ...

  9. iOS开发--OC调用JS篇

    OC调用JS篇 其中相对应的html部分如下: <html> <header> <meta http-equiv="Content-Type" con ...

随机推荐

  1. KVM Network Bridging

    from http://hzqtc.github.io/2012/02/kvm-network-bridging.html http://wiki.ubuntu.org.cn/Kvm_%E7%BD%9 ...

  2. c# Http Post访问接口方式

    一.json格式数据提交返回 提交和返回数据都为json格式 参数提交方式:application/json;charset=UTF-8 统一采用UTF-8字符编码 public string Pos ...

  3. 一个java调用python的问题

    使用 ProcessBuilder List<String> commands = new ArrayList(); commands.add("python"); c ...

  4. RPC接口mock测试

    转载:http://blog.csdn.net/ronghuanye/article/details/71124127 1        简介 Dubbo目前的应用已经越来越广泛.或者基于Dubbo二 ...

  5. 倍福TwinCAT(贝福Beckhoff)基础教程 松下驱动器如何执行绝对值清零

    点击参数-参数一览,然后修改015为0(设置为绝对编码器方式),点击设定值变更,然后传送,EEP,将参数写入驱动器(保持USB线连接,重启驱动器并确认参数确是改成0了)   监视器-清除多圈数,清除之 ...

  6. Nginx限制连接和请求

    一.ngx_http_limit_conn_module对同一个ip/server的连接数做限制.配置指令:limit_conn_zone语法: limit_conn_zone $variable z ...

  7. UnrealEngine4 尝鲜

    把官方事例的demo扩展成横版过关视角

  8. Hadoop eclipse插件使用过程中出现的问题

    http://download.csdn.net/detail/java2000_wl/4326323 转自http://www.ithao123.cn/content-945210.html 由于h ...

  9. 按“开始”-“运行”,或按WIN+R,在[运行]窗口中输入

    command--------CMD命令提示符 ipconfig查看本机IP chkdsk.exe-----Chkdsk磁盘检查   certmgr.msc----证书管理实用程序   calc--- ...

  10. 摘录 LDAP

    1.LDAP就是 light DAP, 轻量级目录访问协议     LDAP是轻量目录访问协议(Lightweight Directory Access Protocol)的缩写     LDAP标准 ...