一:自从IOS7 以后JavaScriptCore iOS 和 js的交互就变的简单
这里我主要来说下 JS 调用 IOS
- 定义一个协议 WXExportProtocol 这个协议是 属于JSExport 协议的。里面有个方法hideMenuBotton,这个方法名是服务器定义好的,如果服务器传一个参数 就定义成- (void)hideMenuBotton:(NSNumber )isHidden;如果传两个参数就定义成- (void)hideMenuBotton:(NSNumber )isHidden :(NSNumber *)num; 依次类推。
//
// WXExportProtocol.h
//
// Created by apple on 16/1/21.
// Copyright © 2016年 李重阳. All rights reserved.
//
#import <Foundation/Foundation.h>
#import <JavaScriptCore/JavaScriptCore.h>
//这里是服务器里面的参数函数
@protocol WXExportProtocol <JSExport>
- (void)hideMenuBotton:(NSNumber *)isHidden;
@end
2.为了能够封装起来 我们需要写一个代理 来把 WXExportProtocol 里面的方法用另外一个协议接出去,具体的看代码
定义一个WXJSObject 和 一个WXJSObjectDelegate 协议
//
// WXJSObject.h
//
// Created by apple on 16/1/21.
// Copyright © 2016年 李重阳. All rights reserved.
//
#import <Foundation/Foundation.h>
// 接好的js的数据, 然后传给外界用的接口
@protocol WXJSObjectDelegate <NSObject>
- (void)wxWeb_hideMenuBotton:(NSNumber *)isHidden;
@end
@interface WXJSObject : NSObject
@property (nonatomic,assign) id<WXJSObjectDelegate>delegate;
@end
//
// WXJSObject.m
//
// Created by apple on 16/1/21.
// Copyright © 2016年 李重阳. All rights reserved.
//
#import "WXJSObject.h"
#import "WXExportProtocol.h"
@interface WXJSObject ()<WXExportProtocol>
@end
@implementation WXJSObject
- (void)hideMenuBotton:(NSNumber *)isHidden {
if ([self.delegate respondsToSelector:@selector(wxWeb_hideMenuBotton:)]) {
[self.delegate wxWeb_hideMenuBotton:isHidden];
}
}
@end
3.接下来在 UIWebView 的一个控制器里面 来调用js
/**
* 开始请求
*/
- (void)webViewDidStartLoad:(LeeWebView *)webView {
//首先创建JSContext 对象(相当于 一个C++ 里面的句柄)
JSContext *context=[webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];
WXJSObject * wxJSObj = [[[WXJSObject alloc]init] autorelease];
wxJSObj.delegate = self;
context[@"WeiXueJS"]=wxJSObj;
self.context = context;
}
/**
* 是否隐藏右边的按钮
*
* @param isHidden
*/
- (void)wxWeb_hideMenuBotton:(NSNumber *)isHidden {
[self.navBar hiddenRightMenus:[isHidden boolValue]];
}