JS与OC中的方法相互调用
文章主要是介绍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中的方法相互调用相关推荐
- React 父组件和子组件中的方法相互调用
目录 父组件调用子组件方法 子组件调用父组件方法 父组件调用子组件方法 父组件中调用子组件的getTree方法 父组件 setFormValue=()=>{this.TreeList.getTr ...
- Python 同一个类中不同函数相互调用
本文采取:Python的类中函数方法相互调用的两种方式_狗哥的博客-CSDN博客 __metaclass__=type class Stu:name=Noneage=Noneschool=" ...
- c语言访问oc变量,OC中的方法调用流程
OC是一门动态语言,其方法调用方式与C++还是有很大区别的. 具体的方法调用过程,可以参考下面一片枫叶的博客,写的还是很详细的. 对于OC的方法调用,有两个点是重点: 1.对于OC的一切方法调用,最终 ...
- iOS底层探索二(OC 中 alloc 方法 初探)
前言 相关文章: iOS底层探索一(底层探索方法) iOS底层探索三(内存对齐与calloc分析) iOS底层探索四(isa初探-联合体,位域,内存优化) iOS底层探索五(isa与类的关系) iOS ...
- OC中的方法、设置器与访问器、便利初始化函数及便利构造器的相关问题
OC中的方法 方法:类的功能代码,在<.h>文件中声明,在<.m>文件中实现. 语法: -|+(返回值类型)方法名:(参数类型)参数名 { //方法体 } 示例: -(void ...
- Spring - 同一个类中的方法互相调用,注解失效问题的分析和解决(转)
Spring - 同一个类中的方法互相调用,注解失效问题的分析和解决(转) 参考文章: (1)Spring - 同一个类中的方法互相调用,注解失效问题的分析和解决(转) (2)https://www. ...
- swift 打包sdk_在封装SDK中Swift和OC混编之相互调用
oc和swift混编之相互调用.jpg 在非SDK中: 1.swift调用oc 步骤: 创建 工程名-Bridging-Header.h 放入oc的头文件,swift即可调用 在swift项目中或者在 ...
- 如何解决Spring在同类方法相互调用中,事务,缓存等注解不生效的问题
☀️相信在日常开发中,一定经历过这样一个场景,就以下面这段代码抽象一下: @Service public class ServiceA {public void methodA() {methodB( ...
- Spring 事务方法与非事务方法相互调用 @Transactional 注解失效不回滚?
写这篇文章的初衷呢就是最近遇到了一个Spring事务的大坑.与其说是坑,还不如说是自己事务这块儿太薄弱导致的(自嘲下). 项目环境 Spring Boot 下面开始问题描述,发生的过程有点长,想直接看 ...
最新文章
- 2020年国际学术会议参考列表
- C#简单操作Excel
- markdown学习记录
- Android--使用VideoView播放视频
- 5 zabbix 添加host_Zabbix 快速上手——添加 Agent 主机
- 你让,勋爵? 使用Jenkins声明性管道的Docker中的Docker
- elementui树状菜单tree_vue.js+element-ui做出菜单树形结构
- mysql数据库查询笔记_mysql笔记: 查询
- 三元运算符 python_Python三元运算符
- Vue项目中如何实现用户登录及token验证?
- FreeRTOS之源码 及 移植详解
- win7 64位装sql2000
- 字节序(byte order)和位序(bit order)
- 【图像处理】canny和sobel边缘检测__python-opencv
- 防止孩子使用计算机的软件,如何防止熊孩纸在电脑里乱装软件
- javaWeb新闻管理系统
- 泛微OA的http接口创建
- 基于matlab的二元幅值光栅设计程序
- python多条件选股_通达信几种实用的条件选股公式,一旦掌握,至少翻翻!
- ant-desigh+prolayout布局,修改面包屑的分隔符号,百度搜遍了都找不到办法,csdn解决了
热门文章
- java异步执行任务
- dbcontext mysql_mysql – ‘DbContextOptionsBuilder’不包含’UseSqlServer’的定义
- 软件获取手机的ime权限_【手机谷歌软件下载】【安卓+iOS】老湿机最爱~免翻,获取各种“特殊”资源!...
- JZOJ 5660. 【HNOI2018D2T3】道路
- oracle临时表空间大小查询,查看oracle 系统临时表空间、undo表空间、SGA和PGA大小...
- 西门子200恒压供水梯形图_求西门子plc200恒压供水编程实例(梯形图)急急急......望高手指点!...
- python import出错_Python ImportError: cannot import name urlopen错误分析
- anaconda tensorflow 2.3_2020款福特撼路者将于7月17日上市 动力升级/搭载2.3T+10AT
- 湘西州计算机等级考试内容,2020年3月湖南省湘西州市计算机等级考试注意事项...
- java 连接sqlserver2005_JAVA用jdbc连接SQLServer2005