JavaScriptCore.framework基本用法(二)
接着上节我们讲到的iOS调用js
下来我们使用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两种方式都完成了
JavaScriptCore.framework基本用法(二)的更多相关文章
- JavaScriptCore.framework基本用法(一)
从iOS7开始 苹果公布了JavaScriptCore.framework 它使得JS与OC的交互更加方便了. 下面我们就简单了解一下这个框架 首先我导入framework 方法如下 点击Linked ...
- iOS中JS 与OC的交互(JavaScriptCore.framework)
iOS中实现js与oc的交互,目前网上也有不少流行的开源解决方案: 如:react native 当然一些轻量级的任务使用系统提供的UIWebView 以及JavaScriptCore.framewo ...
- ios7 JavaScriptCore.framework
曾经想要oc调用js代码通常是通过uiwebview的stringByEvaluatingJavaScriptFromString方法,或是直接使用JavaScriptCore引擎,比如https:/ ...
- iOS开发:JavaScriptCore.framework的简单使用--JS与OC的交互篇
iOS7之后苹果为众猿推出了JavaScriptCore.framework这个框架,这个框架为大家在与JS交互上提供了很大帮助,可以在html界面上调用OC方法并传参,也可以在OC上调用JS方法并传 ...
- react基础用法二(组件渲染)
react基础用法二(组件渲染) 如图所示组件可以是函数 格式:function 方法名(){ return <标签>内容</标签>} 渲染格式: <方法名 /> ...
- Java关于Properties用法(二)——替换配置文件中的参数
上一章讲了配置文件的基本用法,虽然上一章已经可以解决一些需求,但还不些不足之处.假如,配置文件里面的字符串有一部分需要经常变动,另外一些不需要,上一章的方法就不方便了,所以这章主要讲如何在配置文件中使 ...
- Entity Framework 程序设计入门二 对数据进行CRUD操作和查询
前一篇文章介绍了应用LLBL Gen生成Entity Framework所需要的类型定义,用一行代码完成数据资料的读取, <LLBL Gen + Entity Framework 程序设计入门& ...
- Robot Framework自动化测试(二)---元素定位
说明: 不要误认为Robot framework 只是个web UI测试工具,更正确的理解Robot framework是个测试框架,之所以可以拿来做web UI层的自动化是国为我们加入了seleni ...
- 关于Unity中的刚体和碰撞器的相关用法(二)
在关于Unity中的刚体和碰撞器的相关用法(一)的基础上 有一个plane平面,一个ball球体,都挂了碰撞器,ball挂了刚体Rigidbody,写了一个脚本ball挂载在球体上,球体从空中落下装机 ...
随机推荐
- EditText无法失去焦点、失去焦点隐藏软键盘
很奇怪,我在给EditText设置setOnFocusChangeListener()监听,但是始终未能成功,焦点一直存在,不知其原因,,代码如下: et_username.setOnFocusCha ...
- chrome调试ajax
network可以查看ajax的信息.非常的实用.
- [LeetCode][Python]Add Two Numbers
# -*- coding: utf8 -*-'''__author__ = 'dabay.wang@gmail.com'https://oj.leetcode.com/problems/add-two ...
- python-大话装饰器
装饰器 装饰器是个什么玩意呢?是个会了不难,装逼神器.但是如果不了解理解起来还是很抽象,让我们试试这个装逼神器吧! 1.什么是装饰器 装饰器是一个很著名的设计模式,经常被用于有切面需求的场景,较为经典 ...
- 链表-Reverse Linked List
/** * Definition for singly-linked list. * struct ListNode { * int val; * struct ListNode *next; * } ...
- 三维CAD塑造——基于所述基本数据结构一半欧拉操作模型
三维CAD塑造--基于所述基本数据结构一半欧拉操作模型(elar, B_REP) (欧拉操作 三维CAD建模课程 三维CAD塑造 高曙明老师 渲染框架 brep 带洞 带柄 B_REP brep ...
- JavaScript引用类型之Array数组的拼接方法-concat()和截取方法-slice()
1.concat() 基于当前数组中的所有项创建一个新数组(也就是副本),然后将接收到的参数添加到副本的末尾,最后返回新构建的数组.也就是说,concat()在向数组中追加元素时,不会改变原有数组 ...
- HTML5增加的几个新的标签
HTML5又2008年诞生,HTML5大致可以等同于=html+css3+javascriptapi.... so --->支持css3强大的选择器和动画以及javascript的新的函数 先来 ...
- s2sh遇到的问题
一:ids for this class must be manually assigned before calling save() "类名.hbm.xml"映射文件中< ...
- log4j.xml配置示例
这是log4j1.x版本讲解,log4j-1.2.16.jar 1. 一般的log4j.xml的两种配置方式: 1.Logger 完成日志信息的处理定义输出的层次和决定信息是否输出DEBUG&l ...