文章主要是介绍oc如何调用js 以及js的代码调用oc的方法

先上代码后做解释

//oc的.m 的代码

//ps接下来有js的代码一并解析,最后会附上demo

//  ViewController.m

//  JSAndOC

//

//  Created by dongqiangfei on 16/7/21.

//  Copyright © 2016年 dongqiangfei. All rights reserved.

//

#import "ViewController.h"

#import <JavaScriptCore/JavaScriptCore.h>

@interface ViewController ()<UIWebViewDelegate>

@property(nonatomic,strong)UIWebView *webView;

@end

@implementation ViewController

- (void)viewDidLoad {

[super viewDidLoad];

[self makeBtn];

[self makeWeb];

// Do any additional setup after loading the view, typically from a nib.

}

-(void)makeBtn

{

UIButton *thisBtn = [UIButton buttonWithType:UIButtonTypeRoundedRect];

thisBtn.frame = CGRectMake(100, 100, 140, 40);

[thisBtn addTarget:self action:@selector(ocCallJS) forControlEvents:UIControlEventTouchUpInside];

[thisBtn setTitle:@"点击oc调用js" forState:UIControlStateNormal];

[self.view addSubview:thisBtn];

}

-(void)ocCallJS

{

[self.webView stringByEvaluatingJavaScriptFromString:[NSString stringWithFormat:@"showTitleMessage('%@')",@"oc调用了js的内容"]];

}

-(void)makeWeb

{

self.webView = [[UIWebView alloc] initWithFrame:CGRectMake(0, 200, self.view.frame.size.width, self.view.frame.size.height - 200)];

self.webView.backgroundColor = [UIColor whiteColor];

self.webView.scalesPageToFit = YES;

self.webView.delegate = self;

NSString *webPath = [[NSBundle mainBundle] pathForResource:@"ocandjs" ofType:@"html"];

NSURL *webURL = [NSURL fileURLWithPath:webPath];

NSURLRequest *URLRequest = [[NSURLRequest alloc] initWithURL:webURL];

[self.webView loadRequest:URLRequest];

[self.view addSubview:self.webView];

JSContext *content = [self.webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];

content[@"bdgt"] = ^() {

NSLog(@"js调用oc---------begin--------");

NSArray *thisArr = [JSContext currentArguments];

for (JSValue *jsValue in thisArr) {

NSLog(@"=======%@",jsValue);

}

//JSValue *this = [JSContext currentThis];

//NSLog(@"this: %@",this);

NSLog(@"js调用oc---------The End-------");

[self.webView stringByEvaluatingJavaScriptFromString:@"show();"];

};

}

- (void)didReceiveMemoryWarning {

[super didReceiveMemoryWarning];

// Dispose of any resources that can be recreated.

}

@end

//js的代码

<html>

<!--描述网页信息-->

<head>

<meta charset="UTF-8"/>

<title>iOS上webView与JS交互的之oc调用js的demo</title>

<script>

function show()

{

alert('js调用了oc的代码');

}

function showTitle()

{

alert(document.title);

}

function showTitleMessage(message)

{

alert(message);

}

function repost()

{

location.href = "http://www.iosxxx.com";

}

function sum()

{

return 1 + 1;

}

function btnClick()

{

bdgt("hello world");

<!--xmg://sendMessageWithNumber_andContent_?10086&love-->

location.href = "xmg://callWithNumber_?15830654880";

}

</script>

</head>

<!--网页具体内容-->

<body>

<br>下面是网页</br><br/>

<button style = "background: yellow; height: 150px; width: 350px;" onclick = "btnClick();">点击按钮js调用oc</button>

</body>

</html>

解析oc调用js的方法

知道的这么一种方法如下:

[self.webView stringByEvaluatingJavaScriptFromString:[NSString stringWithFormat:@"showTitleMessage('%@')",@"oc调用了js的内容"]];

对应

function showTitleMessage(message)

或者

[self.webView stringByEvaluatingJavaScriptFromString:@"show();"];

对应

function show()

这个方法都对应js的相应的方法.如上

使用oc调动js 注意写法如:

[NSString stringWithFormat:@"showTitleMessage('%@')",@"oc调用了js的内容"]不能写成

[NSString stringWithFormat:@"showTitleMessage(%@)",@"oc调用了js的内容"],否则调不起.

js调用  oc 的方法

这个主要是指的点击网页上的特定的方法调用原生的的特定方法 这个有一种简单粗暴地方法,不懂得名字, 就是直接吊起的如

-(BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType

{

if ([[NSString stringWithFormat:@"%@",request.URL] isEqualToString:@"特定的连接"]) {

NSLog(@"吊起oc的方法");

}

return NO;//不加载网页

return YES;//加载网页

}

直接在点击网页的某个方法加载网页之前,在代理中拿到将要加载的网页,去做相应的判断.最早就是这样做,也有局限性吧,但是这样感觉比单纯的js调用原生效率要高点.

接下来言归正传介绍正宗的js如何调用oc

如下核心方法也就这么点

JSContext *content = [self.webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];

content[@"bdgt"] = ^() {

NSLog(@"js调用oc---------begin--------");

NSArray *thisArr = [JSContext currentArguments];

for (JSValue *jsValue in thisArr) {

NSLog(@"=======%@",jsValue);

}

//JSValue *this = [JSContext currentThis];

//NSLog(@"this: %@",this);

NSLog(@"js调用oc---------The End-------");

[self.webView stringByEvaluatingJavaScriptFromString:@"show();"];

};

本文摘自iOS攻城狮:http://www.cnblogs.com/godlovexq/p/5691942.html

转载于:https://www.cnblogs.com/pengoeng/p/6073179.html

JS与OC中的方法相互调用相关推荐

  1. React 父组件和子组件中的方法相互调用

    目录 父组件调用子组件方法 子组件调用父组件方法 父组件调用子组件方法 父组件中调用子组件的getTree方法 父组件 setFormValue=()=>{this.TreeList.getTr ...

  2. Python 同一个类中不同函数相互调用

    本文采取:Python的类中函数方法相互调用的两种方式_狗哥的博客-CSDN博客 __metaclass__=type class Stu:name=Noneage=Noneschool=" ...

  3. c语言访问oc变量,OC中的方法调用流程

    OC是一门动态语言,其方法调用方式与C++还是有很大区别的. 具体的方法调用过程,可以参考下面一片枫叶的博客,写的还是很详细的. 对于OC的方法调用,有两个点是重点: 1.对于OC的一切方法调用,最终 ...

  4. iOS底层探索二(OC 中 alloc 方法 初探)

    前言 相关文章: iOS底层探索一(底层探索方法) iOS底层探索三(内存对齐与calloc分析) iOS底层探索四(isa初探-联合体,位域,内存优化) iOS底层探索五(isa与类的关系) iOS ...

  5. OC中的方法、设置器与访问器、便利初始化函数及便利构造器的相关问题

    OC中的方法 方法:类的功能代码,在<.h>文件中声明,在<.m>文件中实现. 语法: -|+(返回值类型)方法名:(参数类型)参数名 { //方法体 } 示例: -(void ...

  6. Spring - 同一个类中的方法互相调用,注解失效问题的分析和解决(转)

    Spring - 同一个类中的方法互相调用,注解失效问题的分析和解决(转) 参考文章: (1)Spring - 同一个类中的方法互相调用,注解失效问题的分析和解决(转) (2)https://www. ...

  7. swift 打包sdk_在封装SDK中Swift和OC混编之相互调用

    oc和swift混编之相互调用.jpg 在非SDK中: 1.swift调用oc 步骤: 创建 工程名-Bridging-Header.h 放入oc的头文件,swift即可调用 在swift项目中或者在 ...

  8. 如何解决Spring在同类方法相互调用中,事务,缓存等注解不生效的问题

    ☀️相信在日常开发中,一定经历过这样一个场景,就以下面这段代码抽象一下: @Service public class ServiceA {public void methodA() {methodB( ...

  9. Spring 事务方法与非事务方法相互调用 @Transactional 注解失效不回滚?

    写这篇文章的初衷呢就是最近遇到了一个Spring事务的大坑.与其说是坑,还不如说是自己事务这块儿太薄弱导致的(自嘲下). 项目环境 Spring Boot 下面开始问题描述,发生的过程有点长,想直接看 ...

最新文章

  1. 2020年国际学术会议参考列表
  2. C#简单操作Excel
  3. markdown学习记录
  4. Android--使用VideoView播放视频
  5. 5 zabbix 添加host_Zabbix 快速上手——添加 Agent 主机
  6. 你让,勋爵? 使用Jenkins声明性管道的Docker中的Docker
  7. elementui树状菜单tree_vue.js+element-ui做出菜单树形结构
  8. mysql数据库查询笔记_mysql笔记: 查询
  9. 三元运算符 python_Python三元运算符
  10. Vue项目中如何实现用户登录及token验证?
  11. FreeRTOS之源码 及 移植详解
  12. win7 64位装sql2000
  13. 字节序(byte order)和位序(bit order)
  14. 【图像处理】canny和sobel边缘检测__python-opencv
  15. 防止孩子使用计算机的软件,如何防止熊孩纸在电脑里乱装软件
  16. javaWeb新闻管理系统
  17. 泛微OA的http接口创建
  18. 基于matlab的二元幅值光栅设计程序
  19. python多条件选股_通达信几种实用的条件选股公式,一旦掌握,至少翻翻!
  20. ant-desigh+prolayout布局,修改面包屑的分隔符号,百度搜遍了都找不到办法,csdn解决了

热门文章

  1. java异步执行任务
  2. dbcontext mysql_mysql – ‘DbContextOptionsBuilder’不包含’UseSqlServer’的定义
  3. 软件获取手机的ime权限_【手机谷歌软件下载】【安卓+iOS】老湿机最爱~免翻,获取各种“特殊”资源!...
  4. JZOJ 5660. 【HNOI2018D2T3】道路
  5. oracle临时表空间大小查询,查看oracle 系统临时表空间、undo表空间、SGA和PGA大小...
  6. 西门子200恒压供水梯形图_求西门子plc200恒压供水编程实例(梯形图)急急急......望高手指点!...
  7. python import出错_Python ImportError: cannot import name urlopen错误分析
  8. anaconda tensorflow 2.3_2020款福特撼路者将于7月17日上市 动力升级/搭载2.3T+10AT
  9. 湘西州计算机等级考试内容,2020年3月湖南省湘西州市计算机等级考试注意事项...
  10. java 连接sqlserver2005_JAVA用jdbc连接SQLServer2005