今天碰到了js调用oc oc调用js的需求 为了方便查阅, 记录一下
js 调用OC
#import <JavaScriptCore/JavaScriptCore.h>
- (void)webViewDidFinishLoad:(UIWebView *)webView
{
JSContext *context=[webViewvalueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];
context[@"save"] = ^() {
// js调用的OC代码
NSLog(@"a");
NSArray *args = [JSContextcurrentArguments];//参数数组
for (id objin args) {
NSLog(@"%@",obj);
}
[selfsaveUserID:args[0]];
};
}
js方法为
function NsLogin(param_userid){
save(param_userid);
}
这里需要注意一下, context中的代码块如果添加弹出界面的方法会报错,据我推断原因应该是context的block是在子线程执行的,如果需要更新UI的操作,需要吧更新UI的代码放到主线程中:
context[@"save"] = ^(){
dispatch_sync(dispatch_get_main_queue(), ^{
// 主线程更新界面, 不然报错
});
};
执行下列代码调用 js中的 NsLogin方法并给它传参数'10'
NSString *alertJS=@"NsLogin('10')";//准备执行的js代码
[context evaluateScript:alertJS];
发现当js调用oc的方法之后就不会再走js内部的方法, 不知道是不是我的问题, 写的有什么不对的地方欢迎指正