下来我们看第二种情况 就是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. CENTOS设置MYSQL字符集

    CENTOS设置MYSQL字符集 show variables like 'character_set%'; vim etc/my.cnf 修改成如下: [client] port=3306 sock ...

  2. iOS8使用TestFlight进行内部测试功能尝鲜

    iOS8发布了有一段时间了,我们的策划很新潮的速度给升级到iOS8了.于是XCode5不支持了,只好从MacOS 10.8升级到10.9,再升级到10.9.5,再下载XCode6安装…… 然后前两天上 ...

  3. 【Linux】CentOS7 alien命令 转化deb 与 rpm的相互转化

    -d, --to-deb Make debian packages. This is the default. -r, --to-rpm Make rpm packages. -t, --to-tgz ...

  4. java 后台将base64字符串保存为图片

    直接上代码: import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; impo ...

  5. 设计模式之状态模式(PHP实现)

    github地址:https://github.com/ZQCard/design_pattern /** * 在状态模式(State Pattern)中,类的行为是基于它的状态改变的.这种类型的设计 ...

  6. Swift入门(一)——基本的语法

    近期開始学习swift.把学习的过程和总结整理成一个系列.方便日后回想总结. 基本的语法 基础语法 swift中每一行结束后不须要加分号.多个语句在同一行内须要用分好隔开 //表示凝视.或者用/* - ...

  7. Hadoop之Mapreduce详解

    1. 什么是Mapreduce  Mapreduce是一个分布式运算程序的编程框架,是用户开发“基于hadoop的数据分析应用”的核心框架: Mapreduce核心功能是将用户编写的业务逻辑代码和自带 ...

  8. Java之JDBC学习

    (一),MySql数据库 1,MySql数据库的数据类型定义 2,完整性约束: 3,索引: 作用:唯一作用就是加快对表查询速度,索引通过快速路径方法访问来快速定位数据,从而减少磁盘的II/O; 缺点: ...

  9. How to Clear setInterval() without Knowing the ID

    ProblemDeclaring a setInterval() without keeping a reference to it (which is returned from the funct ...

  10. 转: 理解UDDI (from IBM Dev)

    from: http://www.ibm.com/developerworks/cn/webservices/ws-featuddi/index.html 何为 UDDI? UDDI 项目鼓励 Web ...