OC關于js相關

一、OC調用js

- (void)webViewDidFinishLoad:(UIWebView *)webView
{
    self.title = [webView stringByEvaluatingJavaScriptFromString:@"doucument.title;"];
}

二、js調用OC

  1. 無參
  • 在js中定義一個自己的協(xié)議頭
<script>
  function method()
{
  //login為oc方法
   location.href = 'keven://login';
}
</script>
  • 方法調用
//攔截請求
- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType
{
    NSString *url = request.URL.absoluteString;
    NSString *scheme = @"keven://";
    if ([url hasPrefix:scheme]) {
        //截取方法名
        NSString *methodName = [url substringFromIndex:scheme.length];
        //調用方法
        [self performSelector:NSSelectorFromString(methodName) withObject:nil];
        return NO;
    }
    return YES;
}
  1. 有參
  • 一個參數(shù)的時候
[self performSelector:NSSelectorFromString(methodName) withObject:param];
  • 兩個參數(shù)的時候
[self performSelector:NSSelectorFromString(methodName) withObject:firstParam withObject:secondParam];
  • 多個參數(shù)的時候(使用NSInvocation,同樣適用于一個或者兩個參數(shù))
    a. 給nsobject寫分類
#import "NSObject+Extension.h"

@implementation NSObject (Extension)
- (id)performSelector:(SEL)selector withObjects:(NSArray *)objects
{
    // 方法簽名(方法的描述)
    NSMethodSignature *signature = [[self class] instanceMethodSignatureForSelector:selector];
    if (signature == nil) {
//        @throw [NSException exceptionWithName:@"牛逼的錯誤" reason:@"方法找不到" userInfo:nil];
        [NSException raise:@"牛逼的錯誤" format:@"%@方法找不到", NSStringFromSelector(selector)];
    }
    
    // NSInvocation : 利用一個NSInvocation對象包裝一次方法調用(方法調用者、方法名、方法參數(shù)、方法返回值)
    NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:signature];
    invocation.target = self;
    invocation.selector = selector;
    
    // 設置參數(shù)
    NSInteger paramsCount = signature.numberOfArguments - 2; // 除self、_cmd以外的參數(shù)個數(shù)
    paramsCount = MIN(paramsCount, objects.count);
    for (NSInteger i = 0; i < paramsCount; i++) {
        id object = objects[i];
        //傳入空參數(shù)的時候的處理
        if ([object isKindOfClass:[NSNull class]]) continue;
        //從2開始,應為索引0和1被占用了
        [invocation setArgument:&object atIndex:i + 2];
    }
    
    // 調用方法
    [invocation invoke];
    
    // 獲取返回值
    id returnValue = nil;
    if (signature.methodReturnLength) { // 有返回值類型,才去獲得返回值
        [invocation getReturnValue:&returnValue];
    }
    
    return returnValue;
}
@end

b. 在控制器中調用

[self performSelector:@selector(sendMessage:number2:number3:) withObjects:@[
                                                                        [NSNull null],
                                                                        [NSNull null],
                                                                        @"10010"
                                                                        ]];
//等價于==》
[self sendMessage:nil number2:nil number3:@"10010"];

c. For Example

/**
 * 通過這個方法完成JS調用OC
 * JS和OC交互的第三方框架:WebViewJavaScriptBridge
 */
- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType
{
    // url == xmg://sendMessage_?200
    NSString *url = request.URL.absoluteString;
    NSString *scheme = @"xmg://";
    if ([url hasPrefix:scheme]) {
        // 獲得協(xié)議后面的路徑  path == sendMessage_number2_?200&300
        NSString *path = [url substringFromIndex:scheme.length];
        // 利用?切割路徑
        NSArray *subpaths = [path componentsSeparatedByString:@"?"];
        // 方法名 methodName == sendMessage:number2:
        NSString *methodName = [[subpaths firstObject] stringByReplacingOccurrencesOfString:@"_" withString:@":"];
        // 參數(shù)  200&300
        NSArray *params = nil;
        if (subpaths.count == 2) {
            params = [[subpaths lastObject] componentsSeparatedByString:@"&"];
        }
        // 調用
        [self performSelector:NSSelectorFromString(methodName) withObjects:params];
        
        return NO;
    }
    
    NSLog(@"想加載其他請求,不是想調用OC的方法");
    
    return YES;
}
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

  • Swift1> Swift和OC的區(qū)別1.1> Swift沒有地址/指針的概念1.2> 泛型1.3> 類型嚴謹 對...
    cosWriter閱讀 11,632評論 1 32
  • 1.ios高性能編程 (1).內層 最小的內層平均值和峰值(2).耗電量 高效的算法和數(shù)據(jù)結構(3).初始化時...
    歐辰_OSR閱讀 30,217評論 8 265
  • 轉至元數(shù)據(jù)結尾創(chuàng)建: 董瀟偉,最新修改于: 十二月 23, 2016 轉至元數(shù)據(jù)起始第一章:isa和Class一....
    40c0490e5268閱讀 2,041評論 0 9
  • OC語言基礎 1.類與對象 類方法 OC的類方法只有2種:靜態(tài)方法和實例方法兩種 在OC中,只要方法聲明在@int...
    奇異果好補閱讀 4,517評論 0 11
  • 康佳電視LED50X5680AF自帶了USB接口,并且電視的更多應用里面有內置的文件管理器應用,所以這款電視是可以...
    ckyyouknow閱讀 462評論 3 5

友情鏈接更多精彩內容