最近看了一下js與oc的相互調(diào)用.
1.記得之前在webview中使用js.是使用webview的方法進(jìn)行調(diào)用.
- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType {
...
NSString *jsStr = [NSString stringWithFormat:@"alert('%@')",@"js調(diào)取oc彈框"];
[webView stringByEvaluatingJavaScriptFromString:jsStr];
...
return YES;
}
- (void)webViewDidFinishLoad:(UIWebView *)webView {
NSString *jsStr = [NSString stringWithFormat:@"alert('%@')",@"js調(diào)取oc彈框"];
[webView stringByEvaluatingJavaScriptFromString:jsStr];
}
注意:上方調(diào)取系統(tǒng)彈框會阻塞進(jìn)程.
上面是使用js調(diào)用oc,當(dāng)然也可以使用它來執(zhí)行一些js代碼.可以使用其他js代碼來改變webview中的某些數(shù)據(jù)啊都可以的.
2.使用JavaScriptCore.它是iOS7之后被添加的.
使用它先添加JavaScriptCore框架.然后導(dǎo)入
#import <JavaScriptCore/JavaScriptCore.h>
最后在webview的協(xié)議方法中調(diào)取就行了.
- (void)webViewDidFinishLoad:(UIWebView *)webView
{
//獲取webview中的js內(nèi)容
JSContext *context = [webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];
NSLog(@"%@",context);
NSString *hiddenHeader = @"window.onload=function(){var head= document.getElementById(\"head\");head.style.display = \"none\"}";
//準(zhǔn)備執(zhí)行的js代碼
[context evaluateScript:hiddenHeader];
}
上方代碼是使用oc來調(diào)用js代碼的.
當(dāng)然也可以使用js來調(diào)用oc.比如我們創(chuàng)建一個js方法"test"來進(jìn)行調(diào)用oc代碼.
- (void)webViewDidFinishLoad:(UIWebView *)webView {
JSContext *context = [webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];
//要調(diào)用的方法(此方法創(chuàng)建的是js的方法,只不過是用OC寫的)
context[@"test"] = ^() {
NSArray *args = [JSContext currentArguments];
for (JSValue *jsVal in args) {
//打印傳來的值
NSLog(@"%@", jsVal.toString);
}
};
//在此處往js方法中傳值 -- 然后會在上方block回調(diào)打印出來值
NSString *jsValueStr1 = @"test('value1')";
[context evaluateScript:jsValueStr1];
NSString *jsValueStr2 = @"test('value2')";
[context evaluateScript:jsValueStr2];
}