简单粗暴, 直接上代码。
1、导入头文件 #import<JavaScriptCore/JavaScriptCore.h>
2、webView加载完成的代理方法
-(void)webViewDidFinishLoad:(UIWebView *)webView
{
//取到 JSContext对象(通过当前webView的键获取到JScontext)
JSContext * context = [webViewvalueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];
//web开发者直接调用 toNativeVc() 这个函数即可, 参数不限个数, 我的项目中传的是一个object。
({"vcName":"需要打开的ViewController的类名", "paramName":"参数名", "paramValue":"参数值"} ,如上一篇博客中的打开详情页 {"vcName":"FFNewDetailViewController", "paramName":"goodsid", "paramValue":"121"})
context[@"toNativeVc"] = ^(){
//js传过来的参数列表
NSArray * args = [JSContextcurrentArguments];
id vcName = [NSStringstringWithFormat:@"%@", args[0][@"vcName"]];
id paramName = [NSStringstringWithFormat:@"%@", args[0][@"paramName"]];
id paramValue = [NSStringstringWithFormat:@"%@", args[0][@"paramValue"]];
[selftoNativeControllerWithControllerName:vcNameandParamName:paramName andParamValue:paramValue];
};
}
3、跳转至原生viewController的方法
-(void)toNativeControllerWithControllerName:(NSString *)controllerName andParamName:(NSString *)paramName andParamValue:(NSString *)paramValue
{
//根据类名的字符串得到类
Class controllerClass = NSClassFromString(controllerName);
//创建类的对象
id viewController = [[controllerClassalloc] init];
//将参数名转换成set函数
paramName = [paramName stringByReplacingCharactersInRange:NSMakeRange(0,1)withString:[[paramName substringToIndex:1]uppercaseString]];
SEL setParam =NSSelectorFromString([NSStringstringWithFormat:@"set%@:", paramName]);
dispatch_async(dispatch_get_main_queue(), ^{
if([viewControllerrespondsToSelector:setParam])
{
//执行set方法给参数赋值
[viewController performSelector:setParamwithObject:paramValue];
}
[self.navigationController pushViewController:viewControlleranimated:YES];
});
}
以上的例子中, 只带了一个参数,若需要带多个参数, 则可以将参数名作为key, 参数值为value。 然后在原生方法中进行遍历解析即可。
{"vcName":"FFViewController", "param":{"goodsid":"101", "color":"red", "age":"5"}}