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挂载在球体上,球体从空中落下装机 ...
随机推荐
- python setattr(),getattr()函数
setattr(object,name,value): 作用:设置object的名称为name(type:string)的属性的属性值为value,属性name可以是已存在属性也可以是新属性. get ...
- append与after区别
append() & prepend()实在元素内插入内容(该内容变成该元素的子元素或节点),after() & before()是在元素的外面插入内容(其内容变成元素的兄弟节点).
- Dyanmics CRM您无法登陆系统。原因可能是您的用户记录或所属的业务部门在Microoft Dynamics CRM中已被禁用
当在操作CRM时,做不论什么的写操作包含创建数据.更新数据.都会提示以下截图中的错误:"您无法登陆系统.原因可能是您的用户记录或所属的业务部门在Microoft Dynamics CRM中已 ...
- Android4.0设置界面改动总结(三)
Android4.0设置界面改动总结大概介绍了一下设置改tab风格,事实上原理非常easy,理解两个基本的函数就可以: ①.invalidateHeaders(),调用此函数将又一次调用onBuild ...
- Java面试题之四
十六.运行时异常与一般异常有何异同 Java提供了两类主要的异常:runtime exception和checked exception. 1.checked exception:这种异常也就是我们 ...
- Python之美[从菜鸟到高手]--生成器之全景分析
yield指令,可以暂停一个函数并返回中间结果.使用该指令的函数将保存执行环境,并且在必要时恢复. 生成器比迭代器更加强大也更加复杂,需要花点功夫好好理解贯通. 看下面一段代码: def gen(): ...
- Android解析XML
在Android平台上可以使用Simple API for XML(SAX) . Document Object Model(DOM)和Android附带的pull解析器解析XML文件. 下面是本例子 ...
- UISearchBar总结
UISearchBar介绍 属性 作用 UIBarStyle barStyle 控件的样式 id delegate 设置控件的委托 NSString *text 控件上面的显示的文字 NSString ...
- iOS中关于动态Tableview中的cell数据传输的多线程问题解决之拙见
iOS中关于动态Tableview中的cell数据传输的多线程问题解决之拙见 (2015-12-05 12:48:20)[编辑][删除] 转载▼ 首先我们先明确一下问题: 1.因为UI是在主线 ...
- Svn入门
1.建立svn仓库 命令svnadmin create 仓库名称,如:进入命令行窗口,切换到Svn安装目录下,输入如下命令:svnadmin create F:\software\repos ...