oc和js簡單交互操作

1 ??oc 調(diào)用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 文件內(nèi)容

//聲明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 調(diào)用

- (IBAction)sendToJS:(id)sender {

//階乘方法

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

//

//? ? JSValue *function = [self.context objectForKeyedSubscript:@"factorial"];//調(diào)用js方法 此方法在test.js中

//? ? //傳遞參數(shù)調(diào)用js function js運算的結(jié)果

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

//? ? //

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


//平方方法調(diào)用

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

JSValue *function = [self.context objectForKeyedSubscript:@"powerMethond"];//調(diào)用js方法 此方法在test.js中,方法名字要一樣

//傳遞參數(shù)調(diào)用js function js運算的結(jié)果

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

//

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

}

//運算結(jié)果



2 ?js調(diào)用oc

聲明一個協(xié)議繼承于JSExport

@protocol TestJSExport <JSExport>

(calculateForJS? /** handleFactorialCalculateWithNumber 作為js方法的別名 */,

- (void)handleFactorialCalculateWithNumber:(NSNumber *)number

); //方法起別名 要用()括起來

//沒有別名的方法

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

@end

遵守協(xié)議聲明屬性

@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;

}

? ?

//部分截圖了全部粘貼出了點問題

?調(diào)用方法

#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 協(xié)議關聯(lián) native 的方法

self.context[@"native"] = self;//協(xié)議實現(xiàn)關聯(lián)

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

// 以 block 形式關聯(lián) JavaScript function

self.context[@"log"] =//代碼塊實現(xiàn)關聯(lián)

^(NSString *str)

{

NSLog(@"%@", str);

};

// 以 block 形式關聯(lián) 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];

};

//多參數(shù)

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];

}


總結(jié):這就是比較全面的js 和oc交互的知識點了.

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市战转,隨后出現(xiàn)的幾起案子黔寇,更是在濱河造成了極大的恐慌兴溜,老刑警劉巖异雁,帶你破解...
    沈念sama閱讀 223,002評論 6 519
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異着绊,居然都是意外死亡铆隘,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,357評論 3 400
  • 文/潘曉璐 我一進店門叫确,熙熙樓的掌柜王于貴愁眉苦臉地迎上來跳芳,“玉大人,你說我怎么就攤上這事竹勉》膳瑁” “怎么了?”我有些...
    開封第一講書人閱讀 169,787評論 0 365
  • 文/不壞的土叔 我叫張陵次乓,是天一觀的道長吓歇。 經(jīng)常有香客問我,道長票腰,這世上最難降的妖魔是什么城看? 我笑而不...
    開封第一講書人閱讀 60,237評論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮丧慈,結(jié)果婚禮上析命,老公的妹妹穿的比我還像新娘主卫。我一直安慰自己,他們只是感情好鹃愤,可當我...
    茶點故事閱讀 69,237評論 6 398
  • 文/花漫 我一把揭開白布簇搅。 她就那樣靜靜地躺著,像睡著了一般软吐。 火紅的嫁衣襯著肌膚如雪瘩将。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,821評論 1 314
  • 那天凹耙,我揣著相機與錄音姿现,去河邊找鬼。 笑死肖抱,一個胖子當著我的面吹牛备典,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播意述,決...
    沈念sama閱讀 41,236評論 3 424
  • 文/蒼蘭香墨 我猛地睜開眼提佣,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了荤崇?” 一聲冷哼從身側(cè)響起拌屏,我...
    開封第一講書人閱讀 40,196評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎术荤,沒想到半個月后倚喂,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,716評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡瓣戚,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,794評論 3 343
  • 正文 我和宋清朗相戀三年端圈,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片带兜。...
    茶點故事閱讀 40,928評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡枫笛,死狀恐怖吨灭,靈堂內(nèi)的尸體忽然破棺而出刚照,到底是詐尸還是另有隱情,我是刑警寧澤喧兄,帶...
    沈念sama閱讀 36,583評論 5 351
  • 正文 年R本政府宣布无畔,位于F島的核電站,受9級特大地震影響吠冤,放射性物質(zhì)發(fā)生泄漏浑彰。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 42,264評論 3 336
  • 文/蒙蒙 一拯辙、第九天 我趴在偏房一處隱蔽的房頂上張望郭变。 院中可真熱鬧颜价,春花似錦、人聲如沸诉濒。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,755評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽未荒。三九已至专挪,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間片排,已是汗流浹背寨腔。 一陣腳步聲響...
    開封第一講書人閱讀 33,869評論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留率寡,地道東北人迫卢。 一個月前我還...
    沈念sama閱讀 49,378評論 3 379
  • 正文 我出身青樓,卻偏偏與公主長得像冶共,于是被迫代替她去往敵國和親靖避。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,937評論 2 361

推薦閱讀更多精彩內(nèi)容

  • 隨著H5技術的興起比默,在iOS開發(fā)過程中幻捏,難免會遇到原生應用需要和H5頁面交互的問題。其中會涉及方法調(diào)用及參數(shù)傳值等...
    Chris_js閱讀 3,089評論 1 8
  • OC與JS交互之JavaScriptCore 本文摘抄自:https://hjgitbook.gitbooks.i...
    大沖哥閱讀 1,023評論 0 1
  • 注:JavaScriptCore API也可以用Swift來調(diào)用命咐,本文用Objective-C來介紹篡九。 在iOS7...
    JW_T閱讀 557評論 0 0
  • 一、說明 這篇文章記錄自己在研究OC與JS交互中的所得,以及遇到的問題與解決 由于蘋果的審核時間太漫長醋奠,一次審核不...
    CoderSC閱讀 884評論 0 5
  • 跟原生開發(fā)相比榛臼,H5的開發(fā)相對來一個成熟的框架和團隊來講在開發(fā)速度和開發(fā)效率上有著比原生很大的優(yōu)勢,至少不用等待審...
    大沖哥閱讀 1,847評論 0 7