如何在IOS平台上使用js直接调用OC方法

如何在IOS平台上使用js直接调用OC方法,第1张

本例子是为了让大家能快速开发出OC调用JS功能的一个简单的例子。

1、准备一个本地化的html网页,如jsIOS.html

<script type="text/javaScript">

function postStr(){

return document.getElementById("text1").value

//return "javaScript返回值啦"

}

</script>

2、将此html文件放到项目代码目录里面,如图:

3、拖一个UIWebView控件和UIButton控件到xxxViewController对应的.xib或.storyboard视图的UIView上;

在xxxViewController的.h文件中分别声明UIWebView类型变量和UIButton类型的变量,以及一个按钮点击事件(并且跟视图里面的控件连线),

并且添加一个UIWebViewDelegate类型的委托。<喎�"http://www.2cto.com/kf/ware/vc/" target="_blank" class="keylink">vcD4KPHA+eHh4Vmlld0NvbnRyb2xsZXIuaM7EvP7E2sjdyOfPwqO6PC9wPgo8cD48L3A+CjxwIGNsYXNzPQ=="p1">

#import

@interface ViewController : UIViewController

@property(nonatomic,retain) IBOutlet UIWebView *webview

@property(nonatomic,retain) IBOutlet UIButton *button

-(IBAction)IOS_JS:(id)sender

@end

4、在xxxViewController.m文件中实现通过点击事件,调用javaScript的方法并取得返回值。

代码如下:

#import "ViewController.h"

@interface ViewController ()

@end

@implementation ViewController

@synthesize webview

- (void)viewDidLoad

{

[super viewDidLoad]

//设置webView

webview.backgroundColor = [UIColor clearColor]

//webview.scalesPageToFit =YES

webview.delegate =self

//找到jsIOS.html文件的路径

NSString *basePath = [[NSBundle mainBundle]bundlePath]

NSString *helpHtmlPath = [basePath stringByAppendingPathComponent:@"jsIOS.html"]

NSURL *url = [NSURL fileURLWithPath:helpHtmlPath]

//加载本地html文件

[webview loadRequest:[NSURLRequest requestWithURL:url]]

}

/*

* 点击事件

* 调用javaScript的方法postStr()并取得返回值

* 输出返回值到控制台

*/

-(IBAction)IOS_JS:(id)sender

{

NSString *str = [self.webview stringByEvaluatingJavaScriptFromString:@"postStr()"]

NSLog(@"JS返回值:%@",str)

}

- (void)didReceiveMemoryWarning

{

[super didReceiveMemoryWarning]

}

@end

方法/步骤方法一:通过webview的delegate方法-(BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType;在上面这个函数中,通过截取NSURLRequest解析js中传递过来的参数,和网址再根据参数来调用已定义好的方法。但现在我们介绍另外一种方法。方法二:我们用 javascriptCore.framework 这个库。首先在建立一个UIWebView,代码如下:#import "webview.h" #import <JavaScriptCore/JavaScriptCore.h> @implementation webview -(id)initWithFrame:(CGRect)frame { self=[super initWithFrame:frame] if( self ){ self.webview=[[UIWebView alloc]initWithFrame:CGRectMake(0, 310, self.bounds.size.width, 300)] self.webview.backgroundColor=[UIColor lightGrayColor] NSString *htmlPath=[[NSBundle mainBundle] resourcePath] htmlPath=[htmlPath stringByAppendingPathComponent:@"html/index.html"] NSURL *localURL=[[NSURL alloc]initFileURLWithPath:htmlPath] [self.webview loadRequest:[NSURLRequest requestWithURL:localURL]] [self addSubview:self.webview] JSContext *context = [self.webview valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"] context[@"log"] = ^() { NSLog(@"+++++++Begin Log+++++++") NSArray *args = [JSContext currentArguments] for (JSValue *jsVal in args) { NSLog(@"%@", jsVal) } JSValue *this = [JSContext currentThis] NSLog(@"this: %@",this) NSLog(@"-------End Log-------") } } return self } @end在上面代码中,我们先引入了javascriptCore.framework这个库,然后webview那一套就不多说了,注意我加载一个静态网页。然后我用JSContext *context = [self.webview valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"]获取该UIWebview的javascript执行环境。在该javascript执行环境中,定义一个js函数,注意关键点来了,这个函数的执行体完全是 objective-c代码写的,也就是下面:context[@"jakilllog"] = ^() { NSLog(@"Begin Log") NSArray *args = [JSContext currentArguments] for (JSValue *jsVal in args) { NSLog(@"%@", jsVal) } JSValue *this = [JSContext currentThis] NSLog(@"-------End Log-------") } oc端已经写好了,我们现在进行html部分。看看UIWebView 中所加载的 html及其js代码是如何写的。<!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"> <meta http-equiv="Content-Type" content="text/htmlcharset=utf-8" /> <meta name="description" content=""> <meta name="viewport" content="width=device-widthinitial-scale=1.0"> <script type="text/javascript" src="index.js"></script></head> <button id="hallo" onclick="buttonClick()">点击button</button> </body> </html>上面html定义了一个button,然后引用index.js,点击button的响应函数为buttonClick() 。该函数在index.js中定义,如下 function buttonClick() { jakilllog("hello world") } 注意,jakilllog("hello world") 函数名jakilllog才是我们oc端调用的oc端调用时的代码。context[@"jakilllog"] = ^() { NSLog(@"Begin Log") NSArray *args = [JSContext currentArguments] for (JSValue *jsVal in args) { NSLog(@"%@", jsVal) } JSValue *this = [JSContext currentThis] NSLog(@"-------End Log-------") } 现在的流程是,点击button按钮,响应buttonClick(),去掉用buttonClick()这个方法function buttonClick() { jakilllog("hello world") } 然后执行jakilllog("hello world")并传参“hello world“ 这个函数。这个函数实现在我们oc端,所以调用方法:context[@"jakilllog"] = ^() { NSLog(@"Begin Log") NSArray *args = [JSContext currentArguments] for (JSValue *jsVal in args) { NSLog(@"%@", jsVal) } JSValue *this = [JSContext currentThis] NSLog(@"-------End Log-------") }


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/8364220.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-15
下一篇 2023-04-15

发表评论

登录后才能评论

评论列表(0条)

保存