zoukankan      html  css  js  c++  java
  • iOS-JS和OC的交互

    1.OC调⽤用JS - OC传递数据给JS
    1> 利⽤用UIWebView的某个⽅方法执⾏行JS代码
    NSString *result = [webView stringByEvaluatingJavaScriptFromString:js];
    // result是执⾏行完JS代码后的返回值// 其实也可以通过这个⽅方法办到:JS传递数据给OC2> 举例
    NSString *username = @"zhangsan";
    NSString *pwd = @"888888";
    NSMutableString *js = [NSMutableString string];
    [js appendString:@"function login(username, pwd) { alert(username + '-' +
    pwd);}"];
    [js appendFormat:@"login('%@', '%@');", username, pwd];
    // 在OC中调⽤用JS的函数(执⾏行JS代码)
    [webView stringByEvaluatingJavaScriptFromString:js];
    
    2.JS调⽤用OC - JS传递数据给OC
    
            /* 
             通用url的设计
             协议固定: xxx:
            一般有2个参数:
             1> 方法名
             2> 方法参数
             */
            NSString *onload = @"this.onclick = function() {"
                                "   window.location.href = 'xxx:saveImageToAlbum:&' + this.src;"
                                "};";
            [imgHtml appendFormat:@"<img onload="%@" width="%d" height="%d" src="%@">", onload, width, height, img.src];
    
    
    #pragma mark - <UIWebViewDelegate>
    /**
     *  每当webView发送一个请求之前都会先调用这个方法
     *
     *  @param request        即将发送的请求
     *
     *  @return YES: 允许发送这个请求, NO: 禁止发送这个请求
     */
    - (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType
    {
        NSString *url = request.URL.absoluteString;
        // xxx:call:&10086
        // xxx:sendMsg:body:&10086&2434
        NSRange range = [url rangeOfString:@"xxx:"];
        if (range.location != NSNotFound) {
            NSUInteger loc = range.location + range.length;
            NSString *path = [url substringFromIndex:loc];
            // 获得方法和参数
            NSArray *methodNameAndParam = [path componentsSeparatedByString:@"&"];
            // 方法名
            NSString *methodName = [methodNameAndParam firstObject];
            // 调用方法
            SEL selector = NSSelectorFromString(methodName);
            if ([self respondsToSelector:selector]) { // 判断方法的目的: 防止因为方法不存在而报错
                NSMutableArray *params = nil;
                if (methodNameAndParam.count > 1) { // 方法有参数
                    params = [NSMutableArray arrayWithArray:methodNameAndParam];
                    // 从数组中去掉方法名
                    [params removeObjectAtIndex:0];
                }
                [self performSelector:selector withObjects:params];
            }
            return NO;
        }
        return YES;
    }
    这里用到 performSelector: withObjects 方法 传递多个参数:
    
    - (id)performSelector:(SEL)selector withObjects:(NSArray *)objects {
        NSMethodSignature *signature = [self methodSignatureForSelector:selector];
        if (signature) {
            NSInvocation* invocation = [NSInvocation invocationWithMethodSignature:signature];
            [invocation setTarget:self];
            [invocation setSelector:selector];
            for(int i = 0; i < [objects count]; i++){
                id object = [objects objectAtIndex:i];
                [invocation setArgument:&object atIndex: (i + 2)];
            }
            [invocation invoke];
            if (signature.methodReturnLength) {
                id anObject;
                [invocation getReturnValue:&anObject];
                return anObject;
            } else {
                return nil;
            }
        } else {
            return nil;
        }
    }
  • 相关阅读:
    IOS面试题
    iOS开发多线程篇—线程的状态
    iOS开发多线程篇—GCD介绍
    iOS开发多线程篇—线程间的通信
    iOS开发多线程篇—线程安全
    iOS开发多线程篇—创建线程
    iOS开发多线程篇—多线程简单介绍
    iOS开发UI篇—Quartz2D使用(绘制基本图形)
    iOS开发UI篇—Quartz2D(自定义UIImageView控件)
    iOS开发UI篇—核心动画(UIView封装动画)
  • 原文地址:https://www.cnblogs.com/DarbyCJ/p/4646530.html
Copyright © 2011-2022 走看看