ios wkweb设置图片_iOS WKWebView的使用

WKWebView的使用

前言

最近项目中的UIWebView被替换为了WKWebView,因此来总结一下。

示例Demo:WKWebView的使用

本文将从以下几方面介绍WKWebView:

1、WKWebView涉及的一些类

2、WKWebView涉及的代理方法

3、网页内容加载进度条和title的实现

4、JS和OC的交互

5、本地HTML文件的实现

6、WKWebView+UITableView混排

7、WKWebView离线缓存功能

一、WKWebView涉及的一些类

WKWebView:网页的渲染与展示

注意: #import

//初始化

_webView = [[WKWebView alloc] initWithFrame:CGRectMake(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT) configuration:config];

// UI代理

_webView.UIDelegate = self;

// 导航代理

_webView.navigationDelegate = self;

// 是否允许手势左滑返回上一级, 类似导航控制的左滑返回

_webView.allowsBackForwardNavigationGestures = YES;

//可返回的页面列表, 存储已打开过的网页

WKBackForwardList * backForwardList = [_webView backForwardList];

// NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:@"http://www.chinadaily.com.cn"]];

// [request addValue:[self readCurrentCookieWithDomain:@"http://www.chinadaily.com.cn"] forHTTPHeaderField:@"Cookie"];

// [_webView loadRequest:request];

//页面后退

[_webView goBack];

//页面前进

[_webView goForward];

//刷新当前页面

[_webView reload];

NSString *path = [[NSBundle mainBundle] pathForResource:@"JStoOC.html" ofType:nil];

NSString *htmlString = [[NSString alloc]initWithContentsOfFile:path encoding:NSUTF8StringEncoding error:nil];

//加载本地html文件

[_webView loadHTMLString:htmlString baseURL:[NSURL fileURLWithPath:[[NSBundle mainBundle] bundlePath]]];

WKWebViewConfiguration:为添加WKWebView配置信息

//创建网页配置对象

WKWebViewConfiguration *config = [[WKWebViewConfiguration alloc] init];

// 创建设置对象

WKPreferences *preference = [[WKPreferences alloc]init];

//最小字体大小 当将javaScriptEnabled属性设置为NO时,可以看到明显的效果

preference.minimumFontSize = 0;

//设置是否支持javaScript 默认是支持的

preference.javaScriptEnabled = YES;

// 在iOS上默认为NO,表示是否允许不经过用户交互由javaScript自动打开窗口

preference.javaScriptCanOpenWindowsAutomatically = YES;

config.preferences = preference;

// 是使用h5的视频播放器在线播放, 还是使用原生播放器全屏播放

config.allowsInlineMediaPlayback = YES;

//设置视频是否需要用户手动播放 设置为NO则会允许自动播放

config.requiresUserActionForMediaPlayback = YES;

//设置是否允许画中画技术 在特定设备上有效

config.allowsPictureInPictureMediaPlayback = YES;

//设置请求的User-Agent信息中应用程序名称 iOS9后可用

config.applicationNameForUserAgent = @"ChinaDailyForiPad";

//自定义的WKScriptMessageHandler 是为了解决内存不释放的问题

WeakWebViewScriptMessageDelegate *weakScriptMessageDelegate = [[WeakWebViewScriptMessageDelegate alloc] initWithDelegate:self];

//这个类主要用来做native与JavaScript的交互管理

WKUserContentController * wkUController = [[WKUserContentController alloc] init];

//注册一个name为jsToOcNoPrams的js方法

[wkUController addScriptMessageHandler:weakScriptMessageDelegate name:@"jsToOcNoPrams"];

[wkUController addScriptMessageHandler:weakScriptMessageDelegate name:@"jsToOcWithPrams"];

config.userContentController = wkUController;

WKUserScript:用于进行JavaScript注入

//以下代码适配文本大小,由UIWebView换为WKWebView后,会发现字体小了很多,这应该是WKWebView与html的兼容问题,解决办法是修改原网页,要么我们手动注入JS

NSString *jSString = @"var meta = document.createElement('meta'); meta.setAttribute('name', 'viewport'); meta.setAttribute('content', 'width=device-width'); document.getElementsByTagName('head')[0].appendChild(meta);";

//用于进行JavaScript注入

WKUserScript *wkUScript = [[WKUserScript alloc] initWithSource:jSString injectionTime:WKUserScriptInjectionTimeAtDocumentEnd forMainFrameOnly:YES];

[config.userContentController addUserScript:wkUScript];

WKUserContentController:这个类主要用来做native与JavaScript的交互管理

//这个类主要用来做native与JavaScript的交互管理

WKUserContentController * wkUController = [[WKUserContentController alloc] init];

//注册一个name为jsToOcNoPrams的js方法,设置处理接收JS方法的代理

[wkUController addScriptMessageHandler:self name:@"jsToOcNoPrams"];

[wkUController addScriptMessageHandler:self name:@"jsToOcWithPrams"];

config.userContentController = wkUController;

//用完记得移除

//移除注册的js方法

[[_webView configuration].userContentController removeScriptMessageHandlerForName:@"jsToOcNoPrams"];

[[_webView configuration].userContentController removeScriptMessageHandlerForName:@"jsToOcWithPrams"];

WKScriptMessageHandler:这个协议类专门用来处理监听JavaScript方法从而调用原生OC方法,和WKUserContentController搭配使用。

注意:遵守WKScriptMessageHandler协议,代理是由WKUserContentControl设置

//通过接收JS传出消息的name进行捕捉的回调方法

- (void)userContentController:(WKUserContentController *)userContentController didReceiveScriptMessage:(WKScriptMessage *)message{

NSLog(@"name:%@\\\\n body:%@\\\\n frameInfo:%@\\\\n",message.name,message.body,message.frameInfo);

//用message.body获得JS传出的参数体

NSDictionary * parameter = message.body;

//JS调用OC

if([message.name isEqualToString:@"jsToOcNoPrams"]){

UIAlertController *alertController = [UIAlertController alertControllerWithTitle:@"js调用到了oc" message:@"不带参数" preferredStyle:UIAlertControllerStyleAlert];

[alertController addAction:([UIAlertAction actionWithTitle:@"OK" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {

}])];

[self presentViewController:alertController animated:YES completion:nil];

}else if([message.name isEqualToString:@"jsToOcWithPrams"]){

UIAlertController *alertController = [UIAlertController alertControllerWithTitle:@"js调用到了oc" message:parameter[@"params"] preferredStyle:UIAlertControllerStyleAlert];

[alertController addAction:([UIAlertAction actionWithTitle:@"OK" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {

}])];

[self presentViewController:alertController animated:YES completion:nil];

}

}

二、WKWebView涉及的代理方法

WKNavigationDelegate :主要处理一些跳转、加载处理操作

// 页面开始加载时调用

- (void)webView:(WKWebView *)webView didStartProvisionalNavigation:(WKNavigation *)navigation {

}

// 页面加载失败时调用

- (void)webView:(WKWebView *)webView didFailProvisionalNavigation:(null_unspecified WKNavigation *)navigation withError:(NSError *)error {

[self.progressView setProgress:0.0f animated:NO];

}

// 当内容开始返回时调用

- (void)webView:(WKWebView *)webView didCommitNavigation:(WKNavigation *)navigation {

}

// 页面加载完成之后调用

- (void)webView:(WKWebView *)webView didFinishNavigation:(WKNavigation *)navigation {

[self getCookie];

}

//提交发生错误时调用

- (void)webView:(WKWebView *)webView didFailNavigation:(WKNavigation *)navigation withError:(NSError *)error {

[self.progressView setProgress:0.0f animated:NO];

}

// 接收到服务器跳转请求即服务重定向时之后调用

- (void)webView:(WKWebView *)webView didReceiveServerRedirectForProvisionalNavigation:(WKNavigation *)navigation {

}

// 根据WebView对于即将跳转的HTTP请求头信息和相关信息来决定是否跳转

- (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler {

NSString * urlStr = navigationAction.request.URL.absoluteString;

NSLog(@"发送跳转请求:%@",urlStr);

//自己定义的协议头

NSString *htmlHeadString = @"github://";

if([urlStr hasPrefix:htmlHeadString]){

UIAlertController *alertController = [UIAlertController alertControllerWithTitle:@"通过截取URL调用OC" message:@"你想前往我的Github主页?" preferredStyle:UIAlertControllerStyleAlert];

[alertController addAction:([UIAlertAction actionWithTitle:@"取消" style:UIAlertActionStyleCancel handler:^(UIAlertAction * _Nonnull action) {

}])];

[alertController addAction:([UIAlertAction actionWithTitle:@"打开" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {

NSURL * url = [NSURL URLWithString:[urlStr stringByReplacingOccurrencesOfString:@"github://callName_?" withString:@""]];

[[UIApplication sharedApplication] openURL:url];

}])];

[self presentViewController:alertController animated:YES completion:nil];

decisionHandler(WKNavigationActionPolicyCancel);

}else{

decisionHandler(WKNavigationActionPolicyAllow);

}

}

// 根据客户端受到的服务器响应头以及response相关信息来决定是否可以跳转

- (void)webView:(WKWebView *)webView decidePolicyForNavigationResponse:(WKNavigationResponse *)navigationResponse decisionHandler:(void (^)(WKNavigationResponsePolicy))decisionHandler{

NSString * urlStr = navigationResponse.response.URL.absoluteString;

NSLog(@"当前跳转地址:%@",urlStr);

//允许跳转

decisionHandler(WKNavigationResponsePolicyAllow);

//不允许跳转

//decisionHandler(WKNavigationResponsePolicyCancel);

}

//需要响应身份验证时调用 同样在block中需要传入用户身份凭证

- (void)webView:(WKWebView *)webView didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge completionHandler:(void (^)(NSURLSessionAuthChallengeDisposition disposition, NSURLCredential * _Nullable credential))completionHandler{

//用户身份信息

NSURLCredential * newCred = [[NSURLCredential alloc] initWithUser:@"user123" password:@"123" persistence:NSURLCredentialPersistenceNone];

//为 challenge 的发送方提供 credential

[challenge.sender useCredential:newCred forAuthenticationChallenge:challenge];

completionHandler(NSURLSessionAuthChallengeUseCredential,newCred);

}

//进程被终止时调用

- (void)webViewWebContentProcessDidTerminate:(WKWebView *)webView{

}

WKUIDelegate :主要处理JS脚本,确认框,警告框等

/**

* web界面中有弹出警告框时调用

*

* @param webView 实现该代理的webview

* @param message 警告框中的内容

* @param completionHandler 警告框消失调用

*/

- (void)webView:(WKWebView *)webView runJavaScriptAlertPanelWithMessage:(NSString *)message initiatedByFrame:(WKFrameInfo *)frame completionHandler:(void (^)(void))completionHandler {

UIAlertController *alertController = [UIAlertController alertControllerWithTitle:@"HTML的弹出框" message:message?:@"" preferredStyle:UIAlertControllerStyleAlert];

[alertController addAction:([UIAlertAction actionWithTitle:@"OK" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {

completionHandler();

}])];

[self presentViewController:alertController animated:YES completion:nil];

}

// 确认框

//JavaScript调用confirm方法后回调的方法 confirm是js中的确定框,需要在block中把用户选择的情况传递进去

- (void)webView:(WKWebView *)webView runJavaScriptConfirmPanelWithMessage:(NSString *)message initiatedByFrame:(WKFrameInfo *)frame completionHandler:(void (^)(BOOL))completionHandler{

UIAlertController *alertController = [UIAlertController alertControllerWithTitle:@"" message:message?:@"" preferredStyle:UIAlertControllerStyleAlert];

[alertController addAction:([UIAlertAction actionWithTitle:@"Cancel" style:UIAlertActionStyleCancel handler:^(UIAlertAction * _Nonnull action) {

completionHandler(NO);

}])];

[alertController addAction:([UIAlertAction actionWithTitle:@"OK" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {

completionHandler(YES);

}])];

[self presentViewController:alertController animated:YES completion:nil];

}

// 输入框

//JavaScript调用prompt方法后回调的方法 prompt是js中的输入框 需要在block中把用户输入的信息传入

- (void)webView:(WKWebView *)webView runJavaScriptTextInputPanelWithPrompt:(NSString *)prompt defaultText:(NSString *)defaultText initiatedByFrame:(WKFrameInfo *)frame completionHandler:(void (^)(NSString * _Nullable))completionHandler{

UIAlertController *alertController = [UIAlertController alertControllerWithTitle:prompt message:@"" preferredStyle:UIAlertControllerStyleAlert];

[alertController addTextFieldWithConfigurationHandler:^(UITextField * _Nonnull textField) {

textField.text = defaultText;

}];

[alertController addAction:([UIAlertAction actionWithTitle:@"OK" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {

completionHandler(alertController.textFields[0].text?:@"");

}])];

[self presentViewController:alertController animated:YES completion:nil];

}

// 页面是弹出窗口 _blank 处理

- (WKWebView *)webView:(WKWebView *)webView createWebViewWithConfiguration:(WKWebViewConfiguration *)configuration forNavigationAction:(WKNavigationAction *)navigationAction windowFeatures:(WKWindowFeatures *)windowFeatures {

if (!navigationAction.targetFrame.isMainFrame) {

[webView loadRequest:navigationAction.request];

}

return nil;

}

三、网页内容加载进度条和title的实现

//添加监测网页加载进度的观察者

[self.webView addObserver:self

forKeyPath:@"estimatedProgress"

options:0

context:nil];

//添加监测网页标题title的观察者

[self.webView addObserver:self

forKeyPath:@"title"

options:NSKeyValueObservingOptionNew

context:nil];

//kvo 监听进度 必须实现此方法

-(void)observeValueForKeyPath:(NSString *)keyPath

ofObject:(id)object

change:(NSDictionary *)change

context:(void *)context{

if ([keyPath isEqualToString:NSStringFromSelector(@selector(estimatedProgress))]

&& object == _webView) {

NSLog(@"网页加载进度 = %f",_webView.estimatedProgress);

self.progressView.progress = _webView.estimatedProgress;

if (_webView.estimatedProgress >= 1.0f) {

dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.3 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{

self.progressView.progress = 0;

});

}

}else if([keyPath isEqualToString:@"title"]

&& object == _webView){

self.navigationItem.title = _webView.title;

}else{

[super observeValueForKeyPath:keyPath

ofObject:object

change:change

context:context];

}

}

//移除观察者

[_webView removeObserver:self

forKeyPath:NSStringFromSelector(@selector(estimatedProgress))];

[_webView removeObserver:self

forKeyPath:NSStringFromSelector(@selector(title))];

四、JS和OC的交互

JS调用OC

这个实现主要是依靠WKScriptMessageHandler协议类和WKUserContentController两个类:WKUserContentController对象负责注册JS方法,设置处理接收JS方法的代理,代理遵守WKScriptMessageHandler,实现捕捉到JS消息的回调方法,详情可以看第一步中对这两个类的介绍。

//这个类主要用来做native与JavaScript的交互管理

WKUserContentController * wkUController = [[WKUserContentController alloc] init];

//注册一个name为jsToOcNoPrams的js方法,设置处理接收JS方法的代理

[wkUController addScriptMessageHandler:self name:@"jsToOcNoPrams"];

[wkUController addScriptMessageHandler:self name:@"jsToOcWithPrams"];

config.userContentController = wkUController;

注意:遵守WKScriptMessageHandler协议,代理是由WKUserContentControl设置

//通过接收JS传出消息的name进行捕捉的回调方法 js调OC

- (void)userContentController:(WKUserContentController *)userContentController didReceiveScriptMessage:(WKScriptMessage *)message{

NSLog(@"name:%@\\\\n body:%@\\\\n frameInfo:%@\\\\n",message.name,message.body,message.frameInfo);

}

OC调用JS

//OC调用JS changeColor()是JS方法名,completionHandler是异步回调block

NSString *jsString = [NSString stringWithFormat:@"changeColor('%@')", @"Js参数"];

[_webView evaluateJavaScript:jsString completionHandler:^(id _Nullable data, NSError * _Nullable error) {

NSLog(@"改变HTML的背景色");

}];

//改变字体大小 调用原生JS方法

NSString *jsFont = [NSString stringWithFormat:@"document.getElementsByTagName('body')[0].style.webkitTextSizeAdjust= '%d%%'", arc4random()%99 + 100];

[_webView evaluateJavaScript:jsFont completionHandler:nil];

五、本地HTML文件的实现

由于示例Demo的需要以及知识有限,我用仅知的HTML、CSS、JavaScript的一点皮毛写了一个HTML文件,比较业余,大神勿喷😁😁

小白想学习这方面的知识可以看这里: http://www.w3school.com.cn/index.html

我用MAC自带的文本编辑工具,生成一个文件,改后缀名,强转为.html文件,同时还需要设置文本编辑打开HTML文件时显示代码(如下图),然后编辑代码。

文本编辑偏好设置.png

6、WKWebView+UITableView混排 和 7、WKWebView离线缓存功能 相关内容在 iOS_Tips-12 这里查看。

WKWebView.gif

详情请前往我的Github:WKWebView的使用

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/369924.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

元组的详细操作

一、创建元组 name(chinese,gansu,beijing)创建空元组name()元组中只包含一个元素时,需要在元素后面添加逗号消除歧义name(chinese,) 二、访问元组 元组可以使用下标索引来访问元组中的值name(chinese,gansu,beijing)假如要访问chinese则使用name[0] 三、修改元组 元…

Spring Data JDBC通用DAO实现–迄今为止最轻量的ORM

我很高兴宣布Spring Data JDBC存储库项目的第一个版本。 这个开放源代码库的目的是为基于Spring框架中 JdbcTemplate关系数据库提供通用,轻量且易于使用的DAO实现,与项目的Spring Data 框架兼容。 设计目标 轻巧,快速且开销低。 只有少数几个…

【Spark】SparkStreaming-加载外部配置文件

SparkStreaming-加载外部配置文件 spark加载配置文件_百度搜索Spark加载外部配置文件 - CSDN博客spark读取配置文件中的配置 - CSDN博客spark加载properties配置文件方法 - u013013024的博客 - CSDN博客Spark 官方文档(4)——Configuration配置 - bigbi…

对计算机财务管理的理解,计算机财务管理

计算机财务管理1、引用(P4-P5);易出名词解释、选择题。应识记、理解。答:(1)相对引用(2)绝对引用(3)混合引用2、IF、SUM、VLOOKUP、DGET函数的使用方法(P22、P28、P30、P31) 识记、理解用途,能应用。答:IF函数用逻辑表达式来判断指…

卡盟主站搭建_搭建卡盟主站下载|搭建卡盟主站教程 (附带源码)百度云_ - 极光下载站...

最近,很多小伙伴们都在想搭建一个卡盟的主站,但是鉴于很多人都不太懂编程,也不知道如何找到源码。所以现在小编就为大家带来搭建卡盟主站教程,而且还把源码也一起送来了,想要搭建卡盟主站的话就记得一定要下载哦&#…

【期望DP】

【总览】 【期望dp】 求解达到某一目标的期望花费:因为最终的花费无从知晓(不可能从$\infty$推起),所以期望dp需要倒序求解。 设$f[i][j]$表示在$(i, j)$这个状态实现目标的期望值(相当于是差距是多少)。 首…

复习HTML CSS(2)

n 项目符号嵌套编号思路 标签的内容&#xff08;文本、项目符号、表格、图片等&#xff09;必须放在最底层标记中。 n 图片标记&#xff08;行内元素&#xff0c;单边标记&#xff09; l 语法&#xff1a;<img 属性 “值”> l 常用属性 Width&#xff1a;图片宽…

Spring MVC:使用基于Java的配置创建一个简单的Controller

这是我博客上与Spring MVC相关的第一篇文章。 开端总是令人兴奋的&#xff0c;因此我将尽量简洁明了。 Spring MVC允许以最方便&#xff0c;直接和快速的方式创建Web应用程序。 开始使用这项技术意味着需要Spring CORE的知识。 在文章中&#xff0c;您将了解有关创建简单的Spri…

中鸣循迹机器人_自动循迹机器人控制系统的设计

马家庆,于兆勤,刘建群,黄惠敬,陈炜楠摘要&#xff1a;循迹机器人是智能机器人领域内非常重要且被广泛研究的一种智能移动装置&#xff0c;国内许多重要的比赛都以循迹机器人为核心进行开展的。本文设计的智能循迹避障机器人的控制系统主要由四个模块组成&#xff1a;最小系统模…

2、创建分类器笔记

创建分类器 简介&#xff1a;分类是指利用数据的特性将其分类成若干类型的过程。分类与回归不同&#xff0c;回归的输出是实数。监督学习分类器就是用带标记的训练数 据建立一个模型&#xff0c;然后对未知的数据进行分类。分类器可以实现分类功能的任意算法&#xff0c;最简单…

天刀现在最新服务器,天涯明月刀8.21服务器更新公告

原标题&#xff1a;天涯明月刀8.21服务器更新公告青龙乱舞区、大地飞鹰区、天命风流区、沧海云帆区、边城浪子区全部服务器将在8月21日6:00~12:00停机维护更新&#xff0c;维护完成后上述各服务器客户端版本更新至2.0.95.5。本次维护主要调整和修改内容如下&#xff0c;给您带来…

复习上学期的HTML CSS(1)

自己跟着网上教程复习上学期的HTML CSS&#xff0c;因为已经忘得差不多了&#xff0c;而且现在学的js也要以HTML CSS为基础&#xff0c;坚持每天持续更新。 n B/S 网络结构 Browser/Server 浏览器/服务器&#xff0c;这是现在最流行的网络模式。如新浪网、凤凰网等。 C/S Clie…

XAML或JavaFx?

这是使用XAML和JavaFx构建应用程序的快速&#xff0c;主观&#xff0c; 无权且非常不科学的比较。 比较是基于我与每个人合作的个人经验。 在XAML方面&#xff0c;这意味着WPF和Win8存储应用程序 。 在JavaFx方面&#xff0c;这意味着Windows 7应用程序。 JavaFX JavaFx被Orac…

java面试2

1、list中去重&#xff08;无序&#xff0c;有序&#xff09; 2、list中记录每个出现次数&#xff0c;并去重 public static void main(String[] args) { List<String> li2 new ArrayList<String>(); li2.add("11"); l…

mongodb修改数据语句_MongoDB 之 手把手教你增删改查 MongoDB - 2

如果没看到我的金玉良言的话,就重新打开一次客户端和服务端吧本章我们来学习一下关于 MongoDB的增删改查一.MongoDB操作 之 原生ORM,根本不存在SQL语句创建数据库:这里和一般的关系型数据库一样,都要先建立一个自己的数据库空间嗯嗯嗯嗯,我感受到了你内心的惊呼,瞅瞅你们这些没…

星战前夜服务器维护时间,EVE星战前夜开测时间在什么时候 什么时候测试

EVE星战前夜什么时候开测&#xff0c;EVE星战前夜的测试时间在什么时候&#xff0c;想要知道EVE星战前夜测试时间的小伙伴一起来看看EVE星战前夜的相关资讯&#xff0c;了解一下游戏的开测时间吧。EVE星战前夜目前仍在开发阶段&#xff0c;目前没有进行大范围的测试&#xff0c…

使用Maven Failsafe和TestNG分别运行单元测试和集成测试

最近&#xff0c;对于我的新宠物项目&#xff0c;我决定我希望在标准mvn测试期间执行一些测试&#xff0c;而仅在不同阶段执行一些其他测试 &#xff0c;我们称其为集成阶段。 我在谷歌上搜索&#xff0c;似乎没有任何工作&#xff0c;因此在努力使安装工作顺利进行之后&#x…

3、预测模型笔记

预测模型 1、简介 预测建模&#xff08;Predictive modeling&#xff09;是一种用来预测系统未来行为的分析技术&#xff0c;它由一群能够识别独立输入变量与反馈目标关联关系的算法构成。根据观测值创建一个数学模型&#xff0c;然后用这个模型去预测未来发生的事情。 预测模型…

lintcode-138-子数组之和

138-子数组之和 给定一个整数数组&#xff0c;找到和为零的子数组。你的代码应该返回满足要求的子数组的起始位置和结束位置 注意事项 There is at least one subarray that its sum equals to zero. 样例 给出 [-3, 1, 2, -3, 4]&#xff0c;返回[0, 2] 或者 [1, 3]. 标签 子数…

自己做的HTML

<html> <body background"http://img1.imgtn.bdimg.com/it/u821335874,2927998559&fm27&gp0.jpg"><h1 style"text-align:center">网站集中地</h1><p><a href"/html/html_links.asp">点击“本页”&…