iOS中,JS于OC的相互调用
来源:互联网 发布:泰达网络wifi 编辑:程序博客网 时间:2024/05/21 17:28
1.
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>OCJS互调</title>
</head>
<body>
周杰伦
110
<button style="background:red; width:100px; height: 30px"onclick="jsCallOc()">
Call
</button>
<br>
<a href="https://www.baidu.com/">百度一下就知道了</a>
</body>
<script type="text/javascript">
function ocCallJsNoParams() {
alert("oc调用js无参数");
}
function ocCallJsHsParams(name , address){
alert(name+"的地址是:"+address);
}
function jsCallOc(){
location.href = 'InternetProtocol://Parameter1_withParameter2_?name&age';
}
</script>
</html>
用WebView加载以上的静态网页。
2.
#import "NSObject+JSCallOC.h"
@implementation NSObject (JSCallOC)
-(id)t_performSelector:(SEL)aSelector withObject:(NSArray *)objects{
// signature记录方法的返回值和参数类型
NSMethodSignature *signature = [[selfclass] instanceMethodSignatureForSelector:aSelector];
if (signature == nil) {
// 签名没有抛出异常
NSString *reason = [NSStringstringWithFormat:@"没有%@的方法",NSStringFromSelector(aSelector)];
NSException *exception = [NSExceptionexceptionWithName:@"错误"reason:reason userInfo:nil];
@throw exception;
}
// NSInvocation包装了一次方法的调用(方法的调用者,方法名,参数 ,返回值)
NSInvocation *invocation = [NSInvocationinvocationWithMethodSignature:signature];
invocation.target =self;//指定方法的调用
invocation.selector = aSelector;//指定方法名
// 设置参数
NSInteger parameterCount = signature.numberOfArguments -2;
parameterCount = MIN(parameterCount, objects.count);
for (int i =0 ; i < parameterCount; i ++) {
id param = objects[i];
// 剔除空参数
if (![param isKindOfClass:[NSNullclass]]) {
[invocation setArgument:¶matIndex:i +2];
}
}
// 调用
[invocation invoke];
// 设置方法的返回值
id returnValue =nil;
if (signature.methodReturnLength) {
[invocation getReturnValue:&returnValue];
}
return returnValue;
}
3.
#import "ViewController.h"
#import "NSObject+JSCallOC.h"
@interface ViewController ()<UIWebViewDelegate>
@property (weak,nonatomic) IBOutletUIWebView *webView;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
[self.webViewloadRequest:[NSURLRequestrequestWithURL:[[NSBundlemainBundle] URLForResource:@"ocjs.html"withExtension:nil]]];
self.webView.delegate =self;
}
#pragma mark -- webViewDelegate
-(BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType{
//获取url全路径
NSString *url = request.URL.absoluteString;
NSString *protocol =@"internetprotocol://";
if ([url hasPrefix:protocol]) {
//获取协议后的路径
NSString *path = [urlsubstringFromIndex:protocol.length];
//利用占位符分割方法名和 参数
NSArray *subPath = [pathcomponentsSeparatedByString:@"?"];
//获取方法名
NSString *methodName = [subPath.firstObjectstringByReplacingOccurrencesOfString:@"_"withString:@":"];
//获取参数
NSArray *params =nil;
if (subPath.count ==2) {
params = [subPath.lastObjectcomponentsSeparatedByString:@"&"];
}
SEL sel =sel_registerName([methodName UTF8String]);
//调用方法
[selft_performSelector:sel withObject:params];
return NO;
}
return YES;
}
//oc -----> js
-(void)webViewDidFinishLoad:(UIWebView *)webView{
NSString *javaScript =@"ocCallJsNoParams()";
// NSString *javaScript = [NSString stringWithFormat:@"ocCallJsHsParams('%@' , '%@')",@"无限",@"WIFI"];
[webView stringByEvaluatingJavaScriptFromString:javaScript];
}
//js --- >oc
-(void)call:(NSString *)name{
NSLog(@"参数是:%@",name);
NSLog(@"%s",__FUNCTION__);
}
-(void)Parameter1:(NSString *)parameter1 withParameter2:(NSString *)parameter2{
NSLog(@"%@---%@",parameter1,parameter2);
}
- iOS中,JS于OC的相互调用
- IOS WebView中JS和OC相互调用
- iOS - 关于OC和JS的相互调用
- iOS js oc相互调用(JavaScriptCore)
- iOS js oc相互调用(JavaScriptCore)
- iOS js oc相互调用(JavaScriptCore)
- iOS js oc相互调用(JavaScriptCore)
- iOS js oc相互调用(JavaScriptCore)
- iOS js oc相互调用(JavaScriptCore)
- iOS js oc相互调用(JavaScriptCore)
- iOS js oc相互调用(JavaScriptCore)
- iOS js oc相互调用(JavaScriptCore)
- iOS js oc相互调用(JavaScriptCore)
- iOS js oc相互调用(JavaScriptCore)
- iOS js oc相互调用(JavaScriptCore)
- iOS OC和JS相互调用
- iOS js oc相互调用(JavaScriptCore)
- OC与JS之间的相互调用
- ExtJs教程----Ajax.request方法
- Git使用教程及笔记
- TextView的实例使用
- Utils
- Codeforces Round #369 (Div. 2)C. Coloring Trees
- iOS中,JS于OC的相互调用
- 全志R58的官方开发板加载bmi160驱动的步骤2B
- android developer tiny share-20160906
- java 排序算法小节 直接插入排序 冒泡排序 选择性排序 快速排序 归并排序
- 关于tomcat版本与object标签
- 使用.net MVC时数据源打不开的问题
- thread.join() 的用法
- nginx配置从零开始
- 詩經甲骨文在解讀中,因缺少捐助暫停發佈