UIWebView和JS交互程序员iOS Developer

OC与JS的简单的交互

2016-03-24  本文已影响457人  七秒记忆的鱼儿

现在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);
}
这个为自己写的网页内容

3314D8C6-8CEB-42B6-88D0-8BC859754478.png
上一篇下一篇

猜你喜欢

热点阅读