iOS js oc相互调用(JavaScriptCore 下)
下来我们使用js调用iOS
js调用iOS分两种情况
一,js里面直接调用方法
二,js里面通过对象调用方法
首先我们看第一种,直接调用方法。
其中用到了iOS的block
上代码
- -(void)webViewDidFinishLoad:(UIWebView *)webView
- {
- //网页加载完成调用此方法
- //iOS调用js
- //首先创建JSContext 对象(此处通过当前webView的键获取到jscontext)
- JSContext *context=[webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];
- //js调用iOS
- //第一种情况
- //其中test1就是js的方法名称,赋给是一个block 里面是iOS代码
- //此方法最终将打印出所有接收到的参数,js参数是不固定的 我们测试一下就知道
- context[@"test1"] = ^() {
- NSArray *args = [JSContext currentArguments];
- for (id obj in args) {
- NSLog(@"%@",obj);
- }
- };
- //此处我们没有写后台(但是前面我们已经知道iOS是可以调用js的,我们模拟一下)
- //首先准备一下js代码,来调用js的函数test1 然后执行
- //一个参数
- NSString *jsFunctStr=@"test1('参数1')";
- [context evaluateScript:jsFunctStr];
- //二个参数
- NSString *jsFunctStr1=@"test1('参数a','参数b')";
- [context evaluateScript:jsFunctStr1];
- }
以上代码中 给test1赋值的block要是执行了那么结果就是对的,js调用了iOS
我们看结果
我们看到参数被打印出来了,而且一个参数和两个参数都可以,也符合js参数个数不限制
下来我们看第二种情况 就是js 中是通过一个对象来调用方法的。
此处稍微复杂一点我们需要使用到
JSExport
凡事添加了JSExport协议的协议,所规定的方法,变量等 就会对js开放,我们可以通过js调用到
如果js是一个参数或者没有参数的话 就比较简单,我们的方法名和js的方法名保持一致即可
比如: js方法为
- testobject.TestOneParameter('参数1')
那么 我们在oc中添加的代理方法就为
- -(void)TestOneParameter:(NSString *)message;
如果js是多个参数的话 我们代理方法的所有变量前的名字连起来要和js的方法名字一样
比如: js方法为
- testobject.TestTowParameterSecondParameter('参数A','参数B')
他有两个参数 那么我们的代理方法 就是把js的方法名 TestTowParameterSecondParameter 任意拆分成两段作为代理方法名(此处我们拆分为 TestTowParameter 和 SecondParameter ) 那么我们的代理方法就是
- -(void)TestTowParameter:(NSString *)message1 SecondParameter:(NSString *)message2;
我们看代理方法有两个变量别名
TestTowParameter 和 SecondParameter
他两个拼接起来就刚好是我们js的方法名
此处有点绕。我们直接看代码
首先创建一个类 继承NSObject 并且规定一个协议
- #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
类的实现
- #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
下面我们在weibview加载完成之后调用测试一下
代码如下:
- -(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];
- }
结果如下图
好了 我们看到了结果 三个方法都调用了
ok两种方式都完成了
iOS js oc相互调用(JavaScriptCore 下)的更多相关文章
- iOS js oc相互调用JavaScriptCore(一)
原址:http://blog.csdn.net/lwjok2007/article/details/47058101 1.普通调用 从iOS7开始 苹果公布了JavaScriptCore.framew ...
- 转载 iOS js oc相互调用(JavaScriptCore) --iOS调用js
iOS js oc相互调用(JavaScriptCore) 从iOS7开始 苹果公布了JavaScriptCore.framework 它使得JS与OC的交互更加方便了. 下面我们就简单了解一下这 ...
- iOS js oc相互调用(JavaScriptCore)(二)
下来我们使用js调用iOS js调用iOS分两种情况 一,js里面直接调用方法 二,js里面通过对象调用方法 首先我们看第一种,直接调用方法. 其中用到了iOS的block 上代码 -(void)we ...
- iOS js oc相互调用(JavaScriptCore)---js调用iOS --js里面通过对象调用方法
下来我们看第二种情况 就是js 中是通过一个对象来调用方法的. 此处稍微复杂一点我们需要使用到 JSExport 凡事添加了JSExport协议的协议,所规定的方法,变量等 就会对js开放,我们可以通 ...
- iOS js oc相互调用(JavaScriptCore)
http://blog.csdn.net/lwjok2007/article/details/47058795
- 转载 OS js oc相互调用(JavaScriptCore) ---js调用iOS ---js里面直接调用方法
OS js oc相互调用(JavaScriptCore) 接着上节我们讲到的iOS调用js 下来我们使用js调用iOS js调用iOS分两种情况 一,js里面直接调用方法 二,js里面通过对象调用 ...
- Unity3D中C#和js方法相互调用
通过查找资料,Unity3D中C#和js要相互调用彼此的方法,js文件必须放在"Standard Assets". "Pro Standard Assets" ...
- iOS 关于js与OC相互调用的那些事
最近项目上使用js调用OC,OC再次调用JS,再次在JS页面上面回显数据. 项目中使用的是WKWebview,加载网路的URL,其实就是使用WK加载出来的H5网页,在项目中用的是H5网页有个识别按钮, ...
- iOS:在OC中调用JS脚本
示例一:在webView中调用js脚本进行搜索 1.首先导入JavaScriptCore.framework这个框架 2.创建webView.设置代理.请求手机端百度 #import "Vi ...
随机推荐
- Redola.Rpc 集成 Consul 服务发现
Redola.Rpc 解决了什么问题? Redola.Rpc 是一个使用 C# 开发的 RPC 框架,代码开源在 GitHub 上.目前版本仅支持 .NET Framework 4.6 以上版本,未来 ...
- TransactionTemplate编程式事务管理方式的进阶使用---自定义拓展模板类
1, 前面一篇的文章介绍了TransactionTemplate的基本使用方法. 同事在其基础上又做了一层封装,这样更贴合本公司的业务与规范. 2, 首先定义了两个接口: ServiceTemplat ...
- 连续子序列最大和的O(NlogN)算法
对于一个数组,例如:int[] a = {4,-3,5,-2,-1,2,6,-2}找出一个连续子序列,对于任意的i和j,使得a[i]+a[i+1]+a[i+2]+.......+a[j]他的和是所有子 ...
- 如何自己写一个公用的NPM包
以markdown-clear,创建过程为例,讲解整个NPM包创建和发布流程 1 如何创建一个包 1.1 创建并使用一个工程 在GitHub上新建一个仓库,其名markdown-clear clone ...
- HtmlCleaner CleanerProperties 参数配置(转自macken博客,链接:http://macken.iteye.com/blog/1579809)
HtmlCleaner CleanerProperties 参数配置 Parameter Default Explanation advancedXmlEscape true If this para ...
- JS的事件多次触发,只执行最后一次
有时候我们在JS编程的过程中经常遇到一个问题就是事件频繁高速被触发,利用计时器来控制频率又会丢弃掉有用的事件,我们只是想让程序执行最后一次的事件,那么就可以用如下方法解决问题 //写在事件外边,防止被 ...
- POJ 2479 Maximum sum 解题报告
Maximum sum Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 40596 Accepted: 12663 Des ...
- Linux 组配置文件(/etc/group)
一.概述 Linux 组配置(/etc/group)文件分为4个字段,分别为: 组名.组密码.GID和组成员. 二.示例 用户apple和banana的默认组为fruit. [root@titan ~ ...
- Python 协程总结
Python 协程总结 理解 协程,又称为微线程,看上去像是子程序,但是它和子程序又不太一样,它在执行的过程中,可以在中断当前的子程序后去执行别的子程序,再返回来执行之前的子程序,但是它的相关信息还是 ...
- 验证码的Java实现--jsp
<%@ page language="java" pageEncoding="UTF-8" %> <%@ page contentType=& ...