现在iOS和html的混合开发是越来越普遍了,开发的效率也是大大的提高了,但是页面上的直接的交互也越来越重要了。今天又朋友问我,自己就小研究了下。
1.OC与heml的交互现在还是使用UIWedView这个控件
1>OC中调用heml中的方法时使用到UIWedView的stringByEvaluatingJavaScriptFromString的方法
// 利用JS获得当前网页的标题
[self.wedview stringByEvaluatingJavaScriptFromString:@"document.title;"];
2>网页上的操作让OC界面发生的变化我们需要用到UIWedView的代理的方法
/* 拦截wedview的请求
*
* @param request 请求
*
* @return 返回yes时可以发送请求 返回NO就是不可以
*/
-(BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType
下面来介绍下怎么实现的(在storybord拖控件设置大小,托线就不介绍了)
1.我们应该知道加载的那个网页是吧,我自己写了个本地的网页作为测试
// 加载网页 本地网页
[self.wedview loadRequest:[NSURLRequest requestWithURL:[[NSBundle mainBundle] URLForResource:@"index" withExtension:@"html"]]];
// 设置代理
self.wedview.delegate = self;
2.实现代理
warning 注意系统的方法只能多穿两个方法
/**
* 拦截wedview的请求
*
* @param request 请求
*
* @return 返回yes时可以发送请求 返回NO就是不可以
*/
-(BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType{
// 获取点击按钮上要获取的发送的请求
NSString *URLString =[request.URL absoluteString];
// 判断发送的请求是否包含下列特定的字符(应为要用到交互,所以不是个正确的连接,这个和写JS的约定好)
NSString *scheme = @"xmg://";
if ([URLString containsString:scheme]) {
// schem 后面的方法名字和参数截取下来
NSString *path =[URLString substringFromIndex:scheme.length];
// 将方法名字和参数利用特定的符号截取开来 这个用的是@“?“
NSArray *array =[path componentsSeparatedByString:@"?"];
// 获取到方法名字
NSString *methodName = [array firstObject];
// 将方法名中的_特殊符号用OC语法中的:替换掉,形成方法名
NSString *newmethodName = [methodName stringByReplacingOccurrencesOfString:@"_" withString:@":"];
// 获取参数
NSArray *params = nil;
// 判断下js发送的请求里面是否为有参数
if (array.count == 2) {
// 也是利用特殊的符号截取到参数的数组
params = [[array lastObject] componentsSeparatedByString:@"&"];
}
// 判断是否有第二个参数
NSString *twoString = params.count<=1?nil:[params lastObject];
#warning 注意系统的方法只能多穿两个方法 ,我也查询了别人穿多个参数的方法,写了方法,后续上传
// 调用方法
[self performSelector:NSSelectorFromString(newmethodName) withObject:[params firstObject] withObject:twoString];
#warning 注意 一定记得返回NO 不然就UIWedView就跳转页面了
return NO;
}
return YES;
}
3.注意 一定要在控制器中实现你要调用的方法,不然真的会崩溃的。
- (void)sendMessage:(NSString *)number number2:(NSString *)number2{
NSLog(@" %@ %@ ", number, number2);
}
这个为自己写的网页内容
网友评论