iOS JS与OC交互
iOS JS与OC交互
本文内容导航
- 1、`UIWebView` JS 与 OC 交互
- 1.1 OC 调用 JS 函数
- 1.1.1 OC 拼接 JS 字符串调用 JS 方法
- 1.1.2 使用 JSContext 上下文环境调用 JS 函数
- 1.2 JS 调用 OC 函数
- 1.2.1 OC 拦截 JS 超链接操作请求
- 1.2.2 向 JS 中注入 OC 类
- 1.2.3 使用 JSContext 上下文,JS函数 回调 OC 代码块
- 1.3 异常收集
- 2、`WKWebView` OC 与 JS 交互
- 2.1 `WKUIDelegate` 协议
- 2.2 OC 调用 JS 函数
- 2.3 JS 调用 OC
- 2.3.1 拦截 JS 超链接请求
- 2.3.2 OC 接收 JS 发来的消息
- 3、第三方库实现 OC 与 JS 交互
- 3.1 `WebViewJavascriptBridge` 库使用
1、UIWebView
JS 与 OC 交互
UIWebView
在 iOS12 中已经被废弃,同时WKWebView
在iOS8中已经出现。所以无特殊情况的话,我们一般应该也是用不到前者了!
UIWebView
相比于 WKWebView
的使用上会简单很多。
UIWebView
初始化:
self.webView = [[UIWebView alloc] initWithFrame:self.view.bounds];self.webView.delegate = self;[self.view addSubview:self.webView];// 加载本地 H5 文件NSURL *url = [[NSBundle mainBundle] URLForResource:@"index.html" withExtension:nil];NSURLRequest *reqeust = [NSURLRequest requestWithURL:url];[self.webView loadRequest:reqeust];
UIWebViewDelegate
协议的几个方法:
// 拦截JS页面操作请求,JS 调用OC 方法时会用到
- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType;
// 开始加载页面
- (void)webViewDidStartLoad:(UIWebView *)webView;
// 页面加载完毕
- (void)webViewDidFinishLoad:(UIWebView *)webView;
// 页面加载失败
- (void)webView:(UIWebView *)webView didFailLoadWithError:(NSError *)error;
1.1 OC 调用 JS 函数
OC 调用 JS 函数,有两种方法:
①使用
stringByEvaluatingJavaScriptFromString
,拼接 JS 字符串调用。
②使用 JSContext 上下文调用 JS 函数
第一种方法使用相对简单,但复杂业务可能无法实现。
1.1.1 OC 拼接 JS 字符串调用 JS 方法
JS 代码如下:
<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><title>OC与JS交互</title><script>function showAlert_hasReturnValue(str){alert('OC 调用JS ' + str);return '返回值给OC';}function showAlert_noReturnValue(str){alert('OC 调用JS ' + str);}</script></head>
</html>
OC 中调用 JS 函数,是将 JS 拼接成字符串,作为 stringByEvaluatingJavaScriptFromString
方法的参数实现的。
/** OC 调用 JS 无返回值 */
- (IBAction)didClickLeftItem:(id)sender {[self.webView stringByEvaluatingJavaScriptFromString:@"showAlert_noReturnValue('无返回值')"];
}
/** OC 调用 JS 有返回值 */
- (IBAction)didClickRightItem:(id)sender {// OC --> JS 有返回值NSString *resString = [self.webView stringByEvaluatingJavaScriptFromString:@"showAlert_hasReturnValue('有返回值')"];NSLog(@"%@", resString);
}
1.1.2 使用 JSContext 上下文环境调用 JS 函数
UIWebView 加载完成时,初始化上下文环境:
#pragma mark - UIWebViewDelegate
- (void)webViewDidFinishLoad:(UIWebView *)webView {JSContext *context = [self.webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];self.context = context;
}
#pragma mark - 响应
/** OC 调用 JS 无返回值 */
- (IBAction)didClickLeftItem:(id)sender {NSDictionary *dict = @{@"name": @"kangpp", @"age": @28};// 上下文调用 JS 函数[self.context[@"ocCallJS_byJSContext"] callWithArguments:@[dict]];
}
1.2 JS 调用 OC 函数
JS 调用 OC 函数有三种实现方式:
①
webView: shouldStartLoadWithRequest:
协议中拦截 JS 操作。
② 使用 JavaScriptCore,向 JS 中注册 OC 类,JS 函数中直接调用 OC 方法。
③ 使用 JSContext 上下文,JS 回调 OC 代码块。
1.2.1 OC 拦截 JS 超链接操作请求
HTML 文件中,需要调用 OC 方法的标签,添加超链接属性(超链接协议可自定义)。那么该标签的操作将在 UIWebViewDelegate
协议方法 - (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType
中被监听拦截。
JS 文件如下:
<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><title>OC与JS交互</title><script></script></head><body><div><a href="kpp://jsCallOC:/helloword/js">JS 调用 OC 方法(该标签的操作将被 OC 拦截)</a></div></body>
</html>
当点击 <a>
标签时,在 下方协议方法中我们将从request
中获取URL信息:
#pragma mark - UIWebViewDelegate
// 加载所有请求数据,以及控制是否加载
- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType {// URL ==> kpp://jsCallOC:/helloword/jsNSURL *requestURL = request.URL;// URL 的一般格式为 scheme://host:port/path?NSString *scheme = requestURL.scheme;NSString *host = requestURL.host;NSNumber *port = requestURL.port;NSArray *paths = requestURL.pathComponents;// URL 全路径字符串NSString *absoluteString = requestURL.absoluteString;// 端口后的相对路径NSString *path = requestURL.path;return YES;
}
根据以上从 URL 中获取的数据,可以在此设置路由调用 OC 中指定的方法。前提当然是自己协商一致 URL 数据格式。
#pragma mark - UIWebViewDelegate
// 加载所有请求数据,以及控制是否加载
- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType {// request : host + 路由 : 拦截if ([request.URL.scheme isEqualToString:@"kpp"]) {// 方法名 kpp://jsCallOC:/helloword/jsNSString *routerName = request.URL.host;SEL methodSEL = NSSelectorFromString(routerName);// 测试方法为 jsCallOCNSLog(@"routerName => %@", routerName);if ([self respondsToSelector:methodSEL]) {objc_msgSend(self,methodSEL,@"");} else {NSLog(@"没有找到对应的路由方法");}return NO;}return YES;
}
/** JS 调用 OC 的响应方法 */
- (void)jsCallOC {NSLog(@"被JS调用的方法!");UIAlertController *controller = [UIAlertController alertControllerWithTitle:@"提示" message:@"JS调用OC方法" preferredStyle:UIAlertControllerStyleAlert];UIAlertAction *okAction = [UIAlertAction actionWithTitle:@"OK" style:UIAlertActionStyleDefault handler:nil];[controller addAction:okAction];[self presentViewController:controller animated:YES completion:nil];
}
1.2.2 向 JS 中注入 OC 类
向 JS 注入 OC 类,需要引入 <JavaScriptCore/JavaScriptCore.h>
框架,使用 JSContext
向 JS 中注入 OC 类。
同时,被 JS 调用的 OC 方法,需要遵守 JSExport
协议。
例如,需求为 JS 调用 OC 的 getUserInfo
方法,获取应用内用户信息。
首先,要将该方法使用协议约定,并继承JSExport
协议:
@protocol TestProtocol <JSExport>
- (NSString *)getUserInfo;
@end
然后在注入JS的类中遵守TestProtocol
协议并实现 getUserInfo
方法 ,demo中直接在控制器实现:
@interface ViewController ()<UIWebViewDelegate, TestProtocol>
@property (nonatomic, strong) UIWebView *webView;
@end
当 UIWebView 加载完成的时候,使用JSContext
向 WebView 中注入OC类:
#pragma mark - UIWebViewDelegate
- (void)webViewDidFinishLoad:(UIWebView *)webView {JSContext *context = [self.webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];// 可以注入实例对象也可以注入类对象context[@"ViewController"] = self;
}
相应的在JS 中,可以直接使用 OC 类和方法调用:
<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><title>OC与JS交互</title><script>function getUserInfo() {// 注入OC类以后,此处通过OC类名可直接调用var val = ViewController.getUserInfo();alert(val);}</script></head><body><input type="button" value="注入OC类的方式 调用OC方法,并获取返回值" onClick="getUserInfo()" /></body>
</html>
1.2.3 使用 JSContext 上下文,JS函数 回调 OC 代码块
JS 代码中blockOCCode()
就是执行的OC代码块,如下:
<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><title>OC与JS交互</title><script>function jsCallOC_byJSContext() {// arr 是 OC 注入的全局属性,可以在此处处理后,传递给OC// 对注入的属性,做业务处理后返回给 OCarr.splice(0, 1)blockOCCode(arr)}</script></head><body><input type="button" value="JS 调用 OC 方法(JS 回调 OCBlock 代码块)" onClick="jsCallOC_byJSContext()" /></body>
</html>
同理,在OC代码中,当页面加载完毕,就要拿到上下文的引用,注入属性及blockOCCode
代码块赋值:
#pragma mark - UIWebViewDelegate
- (void)webViewDidFinishLoad:(UIWebView *)webView {// 拿到 JS 上下文引用JSContext *context = [self.webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];self.context = context;self.context[@"ViewController"] = self;// js 中注入全局变量[context evaluateScript:@"var arr = ['张三', '李四', '王五', '赵六']"];context[@"blockOCCode"] = ^(NSArray *jsArr){// jsArr 是 JS 传递给 OC代码块的参数NSLog(@"blockOCCode->jsArr == %@", jsArr);// 通过上下文拿到 JS 全局属性//NSArray *orgArr = [JSContext currentArguments];//NSLog(@"blockOCCode->orgArr == %@", orgArr);};
}
如此即可实现 JS 回调 OC 代码块。
1.3 异常收集
JS 异常收集代码:
#pragma mark - UIWebViewDelegate
- (void)webViewDidFinishLoad:(UIWebView *)webView {// 异常收集self.context.exceptionHandler = ^(JSContext *context, JSValue *exception) {NSLog(@"%@",exception);};
}
2、WKWebView
OC 与 JS 交互
WKWebView
初始化:
// 配置类WKWebViewConfiguration *configuration = [[WKWebViewConfiguration alloc] init];// 适配移动设备NSString *jScript = @"var meta = document.createElement('meta'); meta.setAttribute('name', 'viewport'); meta.setAttribute('content', 'width=device-width'); document.getElementsByTagName('head')[0].appendChild(meta);";WKUserScript *wkUScript = [[WKUserScript alloc] initWithSource:jScript injectionTime:WKUserScriptInjectionTimeAtDocumentEnd forMainFrameOnly:YES];WKUserContentController *wkUController = [[WKUserContentController alloc] init];[wkUController addUserScript:wkUScript];configuration.userContentController = wkUController;// 初始化 WebViewself.webView = [[WKWebView alloc] initWithFrame:self.view.frame configuration:configuration];// <WKUIDelegate, WKNavigationDelegate>self.webView.UIDelegate = self;self.webView.navigationDelegate = self;[self.view addSubview:self.webView];// 加载(本地) H5 文件NSString *urlStr = [[NSBundle mainBundle] pathForResource:@"WKWebView_Index.html" ofType:nil];NSURL *fileURL = [NSURL fileURLWithPath:urlStr];[self.webView loadFileURL:fileURL allowingReadAccessToURL:fileURL];
2.1 WKUIDelegate
协议
常用该协议替换 JS 弹窗提示,以获得更好的用户体验。
// 创建一个新的 WebView 视图时调用
- (nullable WKWebView *)webView:(WKWebView *)webView createWebViewWithConfiguration:(WKWebViewConfiguration *)configuration forNavigationAction:(WKNavigationAction *)navigationAction windowFeatures:(WKWindowFeatures *)windowFeatures;
// 视图关闭时调用
- (void)webViewDidClose:(WKWebView *)webView;
// JS 警告框调用
- (void)webView:(WKWebView *)webView runJavaScriptAlertPanelWithMessage:(NSString *)message initiatedByFrame:(WKFrameInfo *)frame completionHandler:(void (^)(void))completionHandler;
// JS 确认框调用
- (void)webView:(WKWebView *)webView runJavaScriptConfirmPanelWithMessage:(NSString *)message initiatedByFrame:(WKFrameInfo *)frame completionHandler:(void (^)(BOOL result))completionHandler;
// JS prompt()函数,该方法会被执行
- (void)webView:(WKWebView *)webView runJavaScriptTextInputPanelWithPrompt:(NSString *)prompt defaultText:(nullable NSString *)defaultText initiatedByFrame:(WKFrameInfo *)frame completionHandler:(void (^)(NSString * _Nullable result))completionHandler;
2.2 OC 调用 JS 函数
OC 调用 JS 是通过 evaluateJavaScript: completionHandler:
方法实现的,JS 代码比较简单:
<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><title>OC与JS交互</title><script>function ocCallJS(str) {alert("OC ---> JS" + str);<!-- return value 通过 evaluateJavaScript: completionHandler: 回调中的值传递给OC -->return "ocCallJS return value";}</script></head>
</html>
OC 代码也不难:
/** OC 调用 JS 返回值在 completionHandler 的回调参数 result 里 */
- (IBAction)didClickRightItem:(id)sender {// OC --> JS 有返回值NSString *jsStr = @"ocCallJS('WK_ocCallJS:OC-->JS')";[self.webView evaluateJavaScript:jsStr completionHandler:^(id _Nullable result, NSError * _Nullable error) {// result 是 JS return 回来的值NSLog(@"%@----%@",result, error);}];
}
2.3 JS 调用 OC
WKWebView 中 JS 调用 OC 函数有两种实现方式:
① 使用
WKNavigationDelegate
协议webView: decidePolicyForNavigationAction: decisionHandler:
方法拦截 JS 操作请求。
② 使用WKScriptMessageHandler
协议userContentController: didReceiveScriptMessage:
方法,接收 JS 发来的特定消息进行解析处理。
2.3.1 拦截 JS 超链接请求
HTML 文件中,需要调用 OC 方法的标签,添加超链接属性(超链接协议可自定义)。那么该标签的操作将在 WKNavigationDelegate
协议方法 - (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler
中被监听拦截。
JS 代码:
<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><title>OC与JS交互</title></head><body><div><a href="kpp://WKWebView_jsCallOC:/helloword/js"> WK 中调用OC </a><div/><br /> </body>
</html>
OC 中拦截,并使用路由调用指定 OC 方法:
#pragma mark - WKNavigationDelegate
// 拦截 JS 代码中的 请求操作
- (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler {if ([navigationAction.request.URL.scheme isEqualToString:@"kpp"]) {NSString *routerName = navigationAction.request.URL.host;SEL methodSEL = NSSelectorFromString(routerName);NSLog(@"routerName => %@", routerName);if ([self respondsToSelector:methodSEL]) {objc_msgSend(self,methodSEL,@"");} else {NSLog(@"没有相应路由");}decisionHandler(WKNavigationActionPolicyCancel);return;}decisionHandler(WKNavigationActionPolicyAllow);
}
// 被 JS 调用的 OC 方法
- (void)WKWebView_jsCallOC {UIAlertController *controller = [UIAlertController alertControllerWithTitle:@"提示" message:@"WK 中JS调用OC方法" preferredStyle:UIAlertControllerStyleAlert];UIAlertAction *okAction = [UIAlertAction actionWithTitle:@"OK" style:UIAlertActionStyleDefault handler:nil];[controller addAction:okAction];[self presentViewController:controller animated:YES completion:nil];
}
2.3.2 OC 接收 JS 发来的消息
该方法使用步骤上相对繁琐,但 WKScriptMessageHandler
协议中只有一个方法userContentController: didReceiveScriptMessage:
① 引入 WKScriptMessageHandler 协议,并使用 config 初始化 WKWebView。
② 注册 ScriptMessageHandler
。
③ 实现协议方法。
④ 移除 ScriptMessageHandler
JS 代码:
<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><title>OC与JS交互</title><script>function jsSendMessage(){// js 发送消息, messgaeToOC 是在 OC 代码中注册过的名称var val = window.webkit.messageHandlers.messgaeToOC.postMessage("js 发送给 OC 的消息");alert(val);}</script></head><body><div><input type="button" value="messgaeHandle" onClick="jsSendMessage()" /><div/><br /></body>
</html>
OC 代码实现步骤:
// ① 引入协议
@interface KYWKContorller ()<WKScriptMessageHandler>
// ② 注册消息处理名称为:messgaeToOC
- (void)viewWillAppear:(BOOL)animated{[super viewWillAppear:animated];[self.webView.configuration.userContentController addScriptMessageHandler:self name:@"messgaeToOC"];
}
// ③ 实现协议方法
#pragma mark - WKScriptMessageHandler
- (void)userContentController:(WKUserContentController *)userContentController didReceiveScriptMessage:(WKScriptMessage *)message{// message.name 就是我们注册的 messgaeToOC// message.body 就是JS发送过来的消息NSLog(@"%@---%@",message.name, message.body);// 根据这两个参数 写我们的业务代码... ...
}
// ④ 控制器销毁时移除 `ScriptMessageHandler`
- (void)viewWillDisappear:(BOOL)animated{[super viewWillDisappear:animated];[self.webView.configuration.userContentController removeScriptMessageHandlerForName:@"messgaeToOC"];
}
3、第三方库实现 OC 与 JS 交互
3.1 WebViewJavascriptBridge
库使用
该节介绍的第三方库是:WebViewJavascriptBridge。
该库支持 UIWebView
和WKWebView
。使用比较简单,上手容易。
使用步骤:
① 引入头文件
② 初始化桥接类实例
③ (JS 调用 OC)OC中registerHandler
注册JS方法,使用block传参及回调;( OC 调用 JS)callHandler
调用 JS 方法,使用block回调JS返回结果。
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>OC与JS交互</title><script><!-- 使用该库,JS 中代码中需要添加:-->function setupWebViewJavascriptBridge(callback) {if (window.WebViewJavascriptBridge) { return callback(WebViewJavascriptBridge); }if (window.WVJBCallbacks) { return window.WVJBCallbacks.push(callback); }window.WVJBCallbacks = [callback];var WVJBIframe = document.createElement('iframe');WVJBIframe.style.display = 'none';WVJBIframe.src = 'wvjbscheme://__BRIDGE_LOADED__';document.documentElement.appendChild(WVJBIframe);setTimeout(function() { document.documentElement.removeChild(WVJBIframe) }, 0)}setupWebViewJavascriptBridge(function(bridge) {// JS 被调用的方法 OCCallJSFunction 定义的标识bridge.registerHandler('OCCallJSFunction', function(data, responseCallback) {alert('JS方法被调用:' + data);responseCallback('OC调用的JS方法已被执行');})}) function jsCallsOCFunc(){WebViewJavascriptBridge.callHandler('jsCallsOC', {'name': 'kpp'}, function(response) {alert(response);})}</script>
</head>
<body><div><input type="button" value="JS 调用 OC 方法" onclick="jsCallsOCFunc()" /> <br /><div/><br /><div><a href="kpp://WKWebView_jsCallOC:/helloword/js"> WK 中调用OC (不使用第三方) </a><div/><br />
</body>
</html>
OC 代码实现:
#import "WebViewJavascriptBridge.h"
@property (strong, nonatomic) WKWebView *webView;
@property (nonatomic, strong) WebViewJavascriptBridge *wjb;
- (void)createWjb {// 初始化桥接类实例self.wjb = [WebViewJavascriptBridge bridgeForWebView:self.webView];// 设置 WKNavigationDelegate 代理,保留该协议使用者依然可用[self.wjb setWebViewDelegate:self];
}
/** JS 调用 OC 方法 */
- (void)jsCallOC {// JS-->OC[self.wjb registerHandler:@"jsCallsOC" handler:^(id data, WVJBResponseCallback responseCallback) {// data 是 JS 传递给OC 的参数,responseCallback可将执行结果回调给 JSNSLog(@"%@---%@----%@",[NSThread currentThread],data,responseCallback);responseCallback(@"JS调用的OC方法已执行");}];
}
/** OC 调用 JS 方法 */
- (void)OCCallJS {[self.wjb callHandler:@"OCCallJSFunction" data:@"传递参数param" responseCallback:^(id responseData) {// data 是 OC 传递给 JS 的参数,responseData是 JS 执行完成后回调给OC 的执行结果NSLog(@"%@--%@",[NSThread currentThread],responseData);}];
}
iOS JS与OC交互相关推荐
- iOS: JS和Native交互的两种方法,iosjsnative交互
iOS: JS和Native交互的两种方法,iosjsnative交互 背景: UIWebView: iOS 用来展示 web 端内容的控件. 1. 核心方法: - (NSString*)string ...
- OC WKWebView的JS与OC交互、Cookie管理
完全抄录:iOS中UIWebView与WKWebView.JavaScript与OC交互.Cookie管理看我就够(中) ####WKWebView 是Apple于iOS 8.0推出的WebKit中的 ...
- UIWebView中JS与OC交互 WebViewJavascriptBridge的使用
一.综述 现在很多的应用都会在多种平台上发布,所以很多程序猿们都开始使用Hybrid App的设计模式.就是在app上嵌入网页,只要写一份网页代码,就可以跑在不同的系统上.在iOS中,app多是通过W ...
- JS和OC交互的简单应用
先简单地说一下思路吧 需求:在App中嵌入一个webView,已经有了网址,但是需要去掉这个网页中的一些内容 解决方案:取到webView要加载的网址,对这个网址对应的网页信息进行修改 简单描述: 遵 ...
- (0085)iOS开发之OC与JS交互高级用法(JavaScriptCore)
前述:JavaScriptCore你不知道的OC与JS之间交互.OC与JS之间用model实现交互.通讯.传值!好玩! 几乎三年来一直断断续续接触OC与JS交互,每次觉得UIWebView OC与JS ...
- iOS下JS与OC互相调用(五)--UIWebView + WebViewJavascriptBridge
WebViewJavascriptBridge是一个有点年代的JS与OC交互的库,使用该库的著名应用还挺多的,目前这个库有7000+star.我去翻看了它的第一版本已经是4年前了,在版本V4.1.4以 ...
- iOS下JS与OC互相调用(二)--WKWebView 拦截URL
在上篇文章中讲述了使用UIWebView拦截URL的方式来处理JS与OC交互. 由于UIWebView比较耗内存,性能上不太好,而苹果在iOS 8中推出了WKWebView. 同样的用WKWebVie ...
- iOS下JS与OC互相调用(一)--UIWebView 拦截URL
1.在JS 中做一次URL跳转,然后在OC中拦截跳转.(这里分为UIWebView 和 WKWebView两种,去年因为还要兼容iOS 6,所以没办法只能采用UIWebView来做.) 2.利用WKW ...
- iOS中JS 与OC的交互(JavaScriptCore.framework)
iOS中实现js与oc的交互,目前网上也有不少流行的开源解决方案: 如:react native 当然一些轻量级的任务使用系统提供的UIWebView 以及JavaScriptCore.framewo ...
最新文章
- 理论+实操: linux中firewalld防火墙基础讲解(转载)
- ios开发-UI基础-应用管理(单纯界面)
- timestamp类型设置默认时间
- NYOJ 14 会场安排问题 贪心算法 之 选择不相交区间
- python学习:map()
- android菜单点击功能怎么做的,单击android中的Menu按钮打开上下文菜单
- 中国大学MOOC 计算机组成原理第4章 测试(上)
- 数据结构与算法之基数排序
- 前端学习(2694):重读vue电商网站15之阻止页签tabs切换
- impdp oracle 只导入表结构_oracle数据库怎么导入dmp,只导入数据不导入表结构?...
- python之判断一个值是不是可以被调用
- 迅捷pdf文档转换器注册码
- NVMe驱动详解系列——第一部分:NVMe驱动初始化和注销
- 内网穿透 (Natapp)
- 列出5个python标准库_5个常用 Python 标准库
- 小学计算机教师面试试题及答案,2019上半年小学信息技术教师资格证面试试题及答案(精选)第一批...
- lisp ssget 浩辰_ssget 详解
- html元素标记不允许使用嵌套,第153天:关于HTML标签嵌套的问题详解
- gdb学习20:总结
- A,B,C,D,E五个人在某天夜里去捕鱼
热门文章
- OMNI.COM The Greatest program in the world
- 网络优化整体解决方案 企业网络优化的好帮手
- 微信支付和支付宝支付所用应用签名如何获取
- .net framework4.0 安装回滚问题
- 兔子与狐狸c语言,【狐狸和兔子的故事】_ 狐狸和兔子故事_亲亲宝贝网
- C++内存管理:内存池实现
- javaweb物品租赁系统源码(毕设)
- Revit启动后,如何把你的命令显示在Revit的Ribbon(工具栏)上?
- 小学生台灯哪个品牌更护眼?学习专用的护眼台灯品牌
- 11 万金油 String,为什么不好用了?