oc和js简单交互操作

1   oc 调用js

    步骤1  先导入 头文件

#import  <JavaScriptCore/JavaScriptCore.h>

//声明一个JSContext属性

@property (strong, nonatomic) JSContext *context;

@property (weak, nonatomic) IBOutlet UILabel *showLable;

@property (weak, nonatomic) IBOutlet UITextField *textField;

步骤2  生成jsconten他对象

- (void)viewDidLoad

{

[super viewDidLoad];

// Do any additional setup after loading the view from its nib.

self.title = @"oc call js";

//生成js 对象

self.context = [[JSContext alloc] init];

//加载js 文件

[self.context evaluateScript:[self loadJsFile:@"test"]];

}

步骤3    js  文件导入

- (NSString *)loadJsFile:(NSString*)fileName

{

NSString *path = [[NSBundle mainBundle] pathForResource:fileName ofType:@"js"];

NSString *jsScript = [NSString stringWithContentsOfFile:path encoding:NSUTF8StringEncoding error:nil];

return jsScript;

}

test.js 文件内容

//声明js 阶乘方法

var factorial = function(n) {

if (n < 0)

return;

if (n === 0)

return 1;

return n * factorial(n - 1)

};

//声明js  平方方法

var powerMethond = function(n) {

return n*n;

};

步骤4  在oc 调用

- (IBAction)sendToJS:(id)sender {

//阶乘方法

//    NSNumber *inputNumber = [NSNumber numberWithInteger:[self.textField.text integerValue]];

//

//    JSValue *function = [self.context objectForKeyedSubscript:@"factorial"];//调用js方法 此方法在test.js中

//    //传递参数调用js function js运算的结果

//    JSValue *result = [function callWithArguments:@[inputNumber]];

//    //

//    self.showLable.text = [NSString stringWithFormat:@"%@", [result toNumber]];


//平方方法调用

NSNumber *inputNumber = [NSNumber numberWithInteger:[self.textField.text integerValue]];

JSValue *function = [self.context objectForKeyedSubscript:@"powerMethond"];//调用js方法 此方法在test.js中,方法名字要一样

//传递参数调用js function js运算的结果

JSValue *result = [function callWithArguments:@[inputNumber]];

//

self.showLable.text = [NSString stringWithFormat:@"%@", [result toNumber]];

}

//运算结果



2  js调用oc

声明一个协议继承于JSExport

@protocol TestJSExport <JSExport>

(calculateForJS  /** handleFactorialCalculateWithNumber 作为js方法的别名 */,

- (void)handleFactorialCalculateWithNumber:(NSNumber *)number

); //方法起别名 要用()括起来

//没有别名的方法

- (void)pushViewController:(NSString *)view title:(NSString *)title;

@end

遵守协议声明属性

@interface JSCallOCViewController : UIViewController<TestJSExport>

@property (weak, nonatomic) IBOutlet UIWebView *webView;

@property (strong, nonatomic) JSContext *context;

@end

初始化方法 加载js

- (void)viewDidLoad

{

[super viewDidLoad];

// Do any additional setup after loading the view from its nib.

self.title = @"js call oc";

NSString *path = [[[NSBundle mainBundle] bundlePath]  stringByAppendingPathComponent:@"JSCallOC.html"];

NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL fileURLWithPath:path]];

[self.webView loadRequest:request];

}

JSCallOC.html 中部分代码js

function showResult(resultNumber)

{

//alert(resultNumber);

document.getElementById("result").innerText = resultNumber;

}

   

//部分截图了全部粘贴出了点问题

 调用方法

#pragma mark - UIWebViewDelegate

- (void)webViewDidFinishLoad:(UIWebView *)webView

{

// 以 html title 设置 导航栏 title

self.title = [webView stringByEvaluatingJavaScriptFromString:@"document.title"];

// 禁用 页面元素选择

//[webView stringByEvaluatingJavaScriptFromString:@"document.documentElement.style.webkitUserSelect='none';"];

// 禁用 长按弹出ActionSheet

//[webView stringByEvaluatingJavaScriptFromString:@"document.documentElement.style.webkitTouchCallout='none';"];

// Undocumented access to UIWebView's JSContext

self.context = [webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];

// 打印异常

self.context.exceptionHandler =

^(JSContext *context, JSValue *exceptionValue)

{

context.exception = exceptionValue;

NSLog(@"%@", exceptionValue);

};

// 以 JSExport 协议关联 native 的方法

self.context[@"native"] = self;//协议实现关联

//[self.context evaluateScript:@"native"];

// 以 block 形式关联 JavaScript function

self.context[@"log"] =//代码块实现关联

^(NSString *str)

{

NSLog(@"%@", str);

};

// 以 block 形式关联 JavaScript function

self.context[@"alert"] =

^(NSString *str)

{

UIAlertView *alert = [[UIAlertView alloc]initWithTitle:@"msg from js" message:str delegate:nil cancelButtonTitle:@"ok" otherButtonTitles:nil, nil];

[alert show];

};

__block typeof(self) weakSelf = self;

self.context[@"addSubView"] =

^(NSString *viewname)

{

UIView *view = [[UIView alloc]initWithFrame:CGRectMake(10, 500, 300, 100)];

view.backgroundColor = [UIColor redColor];

UISwitch *sw = [[UISwitch alloc]init];

[view addSubview:sw];

[weakSelf.view addSubview:view];

};

//多参数

self.context[@"mutiParams"] =

^(NSString *a,NSString *b,NSString *c)

{

NSLog(@"%@ %@ %@",a,b,c);

};

}

#pragma mark - JSExport Methods

- (void)handleFactorialCalculateWithNumber:(NSNumber *)number

{

NSLog(@"%@", number);

NSNumber *result = [self calculateFactorialOfNumber:number];

NSLog(@"%@", result);

[self.context[@"showResult"] callWithArguments:@[result]];

}

- (void)pushViewController:(NSString *)view title:(NSString *)title

{

Class second = NSClassFromString(view);

id secondVC = [[second alloc]init];

((UIViewController*)secondVC).title = title;

[self.navigationController pushViewController:secondVC animated:YES];

}

#pragma mark - Factorial Method

- (NSNumber *)calculateFactorialOfNumber:(NSNumber *)number

{

NSInteger i = [number integerValue];

if (i < 0)

{

return [NSNumber numberWithInteger:0];

}

if (i == 0)

{

return [NSNumber numberWithInteger:1];

}

NSInteger r = (i * [(NSNumber *)[self calculateFactorialOfNumber:[NSNumber numberWithInteger:(i - 1)]] integerValue]);

return [NSNumber numberWithInteger:r];

}


总结:这就是比较全面的js 和oc交互的知识点了.

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,686评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,668评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,160评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,736评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,847评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,043评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,129评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,872评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,318评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,645评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,777评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,470评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,126评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,861评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,095评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,589评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,687评论 2 351

推荐阅读更多精彩内容

  • 随着H5技术的兴起,在iOS开发过程中,难免会遇到原生应用需要和H5页面交互的问题。其中会涉及方法调用及参数传值等...
    Chris_js阅读 3,062评论 1 8
  • OC与JS交互之JavaScriptCore 本文摘抄自:https://hjgitbook.gitbooks.i...
    大冲哥阅读 1,019评论 0 1
  • 注:JavaScriptCore API也可以用Swift来调用,本文用Objective-C来介绍。 在iOS7...
    JW_T阅读 555评论 0 0
  • 一、说明 这篇文章记录自己在研究OC与JS交互中的所得,以及遇到的问题与解决 由于苹果的审核时间太漫长,一次审核不...
    CoderSC阅读 861评论 0 5
  • 跟原生开发相比,H5的开发相对来一个成熟的框架和团队来讲在开发速度和开发效率上有着比原生很大的优势,至少不用等待审...
    大冲哥阅读 1,841评论 0 7