OC与js混合开发
在iOS开发中,大多必然会用到UIWebView,所以我们有必要去研究oc与js的相互调用。
若在app中加载的webView界面进行交互,需要在移动端得到响应,并且进行传值,使oc的代码(方法)得到触发,那么请参照下面的代码实现。
首先在js代码中需要有如下代码
js调用OC
<script type="text/javascript">
function judge() {
window.location.href = "objc://jsToOC#param#李xu#param#http://www.baidu.com";
<!-- "李xu"为传递给oc方法的第一个参数, "http://www.baidu.com"为第二个参数 -->
}
</script>
<button onclick="judge()">点我调用OC</button>
然后在OC代码中加入如下代码即可
#pragma mark -- UIWebViewDelegate委托定义方法
- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType{
NSString *path = [[request URL] absoluteString];
if ([[UIDevice currentDevice].systemVersion doubleValue] >= 7.0) {
path = [path stringByRemovingPercentEncoding];
}else{
path = [path stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
}
if ([path hasPrefix:@"ios"]||[path hasPrefix:@"objc"]) {
NSString *method = [path substringFromIndex:@"objc://".length];
NSArray *sels = [method componentsSeparatedByString:@"#param#"];
SEL todoM;
if (sels.count>1) {
todoM = NSSelectorFromString([NSString stringWithFormat:@"%@:",sels[0]]);
NSMutableArray *params = [NSMutableArray array];
for (int i=1; i<sels.count; i++) {
[params addObject:sels[i]];
}
if ([self respondsToSelector:todoM]) {
[self performSelector:todoM withObject:params afterDelay:0];
}
}else if(sels.count==1){
todoM = NSSelectorFromString([NSString stringWithString:sels[0]]);
if ([self respondsToSelector:todoM]) {
[self performSelector:todoM withObject:nil afterDelay:0];
}
}
return NO;
}
return YES;
}
//触发方法
- (void)jsToOC:(NSArray *)params
{
NSLog(@"%@", params);
/*
LXHyperlinkController *vc = [[LXHyperlinkController alloc] init];
vc.title = params[0];
vc.url = params[1];
[self.navigationController pushViewController:vc animated:YES];
*/
}
这样当点击按钮后OC方法 “jsToOC:” 会得到触发,从而实现了OC与JS的混合开发
简单C程序,迷宫
非名校毕业年薪20W程序员 心得分享
北京:一个大学生每年要花多少钱
PowerPoint超链接字体颜色修改、怎么去掉超链接下划线
河南旅游景点介绍
程序员必看的十大电影
AMD的cpu如何安装Mac OS
C/C++面试之算法系列--去除数组中的重复数字
Warshall算法
- 最新文章
-
Vue指令练习实例-学生信息录入
剑指offer(十一) 二进制中1的个数
剑指offer(九,十) 变态跳台阶,矩形覆盖
剑指offer(七,八),斐波拉切数列,跳台阶
剑指offer(五,六),用两个栈实现队列,旋转数组的最小数字
python 快排+动态交换优化
ES6中的const,set,map,Symbol
剑指offer(四) 重建二叉树
剑指offer(三) 从尾到头打印链表
[WPF/C#] 修改鼠标等待状态
- 热门文章
-
[WPF]64*64的表涂色问题
C# string的转换大全
SQLServer 数据库状态中限制访问设置从SINGLE_USER转换成MULTI_USER一直显示“正在还原”解决办法
【SQL】对于日期DATETIME的条件筛选
git将某分支的某次提交合并到另一分支
Microsoft Jet 数据库引擎找不到输入表或查询 '某表'。 确定它是否存在,以及
DateTime.Now只取前面年月日
ArcMap注册空间数据库时遇到Geodatabase instance already exists.时应该怎么办
来自数据源的 String 类型的给定值不能转换为指定目标列的类型 nvarchar
两个必要张