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互相调用(二)--WKWebView 拦截URL
在上篇文章中讲述了使用UIWebView拦截URL的方式来处理JS与OC交互. 由于UIWebView比较耗内存,性能上不太好,而苹果在iOS 8中推出了WKWebView. 同样的用WKWebVie ...
- iOS 关于js与OC相互调用的那些事
最近项目上使用js调用OC,OC再次调用JS,再次在JS页面上面回显数据. 项目中使用的是WKWebview,加载网路的URL,其实就是使用WK加载出来的H5网页,在项目中用的是H5网页有个识别按钮, ...
随机推荐
- 关于在 loadView 中改变状态栏的可视性
这种问题不知道大家是否遇见过,在此用两句话(时间紧迫,还得加班)分享下今天犯的错误 我把状态栏的的可视性的改变写在了loadView 里面,然后就出现了调用了两次 loadView 和 viewDid ...
- Week8 软件规格说明书
1.概述 本项目组所开发的软件为一个基于Android的手机端的时间管理软件,主要功能为时间管理软件,可以用于管理待办事项,记录一些需要提醒的信息等.有事件提醒.与Google账户同步.课程表等功能. ...
- Android开发随笔1
由于对Android的不了解所以上网看视频学习 昨天: 配置安卓的开发环境,一开始想直接在www.android.com里下载相应的sdk工具整合包后来因为需要越墙便跟从同学那里要了一份sdk 装jd ...
- bower解决js的依赖管理
bower解决js的依赖管理 前言: 一个新的web项目开始,我们总是很自然地去下载需要用到的js类库文件,比如jQuery,去官网下载名为jquery-1.10.2.min.js文件,放到我们的项目 ...
- MVC 数据验证收集代码
控制器 Home using System; using System.Collections.Generic; using System.Linq; using System.Web; using ...
- Careercup - Microsoft面试题 - 5649647234187264
2014-05-10 22:17 题目链接 原题: A draw method is given, write a function to draw a chess board. The Draw m ...
- Upgrading to Java 8——第三章 Optional and Similar Classes
Java程序员对付空指针异常已经好多年了.在Java8中将有新的方式去处理他们.通过包装一个潜在的可能为null的类称为Optianal. 在Java8中添加了the Optional, Option ...
- LESS CSS 框架简介
使用 LESS 简化层叠样式表(CSS)的编写 LESS 是动态的样式表语言,通过简洁明了的语法定义,使编写 CSS 的工作变得非常简单.本文将通过实例,为大家介绍这一框架. 简介 CSS(层叠样式表 ...
- hdu 4004 The Frog's Games
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4004 The annual Games in frogs' kingdom started again ...
- 【BZOJ】【1202】【HNOI2005】狡猾的商人
Orz iwtwiioi http://www.cnblogs.com/iwtwiioi/p/3887617.html 并查集+前缀和 啊……这题应该是水题吧?但是我这个大沙茶居然一天都没想出来…… ...