您的位置:首页 > Web前端 > JavaScript

JS与OC中的方法相互调用

2016-11-17 11:45 106 查看
文章主要是介绍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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: