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的混合开发
Double-checked locking and the Singleton pattern--双重检查加锁失效原因剖析
C语言中,数组名作为参数传递给函数时,退化为指针
蘑菇街笔试
动态规划--股市买入卖出时间点选择问题
Java 查看死锁的方法
linux中shell变量$#,$@,$0,$1,$2的含义解释
Spring中bean的配置
为什么要使用连接池
Hadoop Bloom filter应用示例
- 最新文章
-
arx代码片段
C++写注册表
autocad 注册表
vs2013打包
C++标准库 vector排序
acedssget
pymysql
MySql[二]
Xamarin移动开发备忘
二维数组例题习题
- 热门文章
-
扩展方法
泛型
编写一个Java程序,计算半径为3.0的圆周长和面积并输出结果
(1)若当前字符不是大于0的数字字符,则复制该字符于新字符串中; (2)若当前字符是一个数字字符,且它之后没有后继字符,则简单地将它复制到新字符串中; (3)若当前字符是一个大于0的数字字符,并且还有后继字符,设该数字字符的面值为n,将它的后继字符重复复制n+1次到新字符串中; (4)以上述一次变换为一组,在不同组之间另插入一个"_"用于分割(5))若字符串中包含有下划线'_',则变换为 UL
通过继承Rect类编写一个具有确定位置的矩形类PlainRect,其确定位置用 矩形的左上角坐标来标识,包含: 添加两个属性:矩形左上角坐标startX和startY。 两个构造方法: 带4个参数的构造方法,用于对startX、startY、width和height属性 初始化; 不带参数的构造方法,将矩形初始化为左上角坐标、长和宽都为0 的矩形; 添加一个方法: 判断某个点是否在矩形内部的方法
编写一个Car类,具有final类型的属性品牌,具有功能drive; 定义其子类Aodi和Benchi,具有属性:价格、型号;具有功能:变速; 定义主类E,在其main方法中分别创建Aodi和Benchi的对象并测试对象的特 性。
实现一个名为Person的类和它的子类Employee,Employee有两个子类Faculty 和Staff。 具体要求如下: (1)Person类:姓名,地址,电话号码和电子邮件地址; (2)Employee类:办公室,工资 受雇日期(3)Faculty类:学位 级别(4)Staff类:职务
编写一个类A,该类创建的对象可以调用方法f输出小写的英文字母表。然 后再编写一个A类的子类B,要求子类B必须继承类A的方法f(不允许重写), 子类B创建的对象不仅可以调用方法f输出小写的英文字母表,而且可以调用子 类新增的方法g输出大写的英文字母表。最后编写主类C,在主类的main方法 中测试类A与类B。
在主类E的main方法中,创建类B 的对象并赋给父类A的对象a,使用上转型对象a来测试上转型对象的一些特性。
Monkey类、People类和主类 E。