最近项目由于工期紧张需要有pc端设计两个界面,移动端加载界面。(本来是用JS做交互 但是公司觉得麻烦,所以直接让我用UIWebView加载)。
需求:加载html界面 但是需要跳转界面,和用原生写的一样。
分析:当用UIWebView加载网页时,当点击链接时,捕获链接 然后 再根据链接实行跳转。
开始录入代码:
1、创建UIWebViiew:
//创建
UIWebView * GMWebView;
//绘制页面
GMWebView = [[UIWebView alloc]initWithFrame:CGRectMake(0, 0, kScreenWidth, kScreenHeight-64-44-49)];
GMWebView.delegate = self;
[self.view addSubview:GMWebView];
NSURL * gmUrl = [NSURL URLWithString:_governMentUrl];
// NSURL * gmUrl = [NSURL URLWithString:@"https://www.baidu.com"];
NSURLRequest * request = [NSURLRequest requestWithURL:gmUrl];
[GMWebView loadRequest:request];
[[JLJTools shareInstance] ShowWithString:@"加载中..."];(ps:项目中自己定义的UIProgressHUD)
2、实现UIWebView的代理方法
@optional
// 如果返回NO,代表不允许加载这个请求 返回YES 代表允许加载这个请求
- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType;
//UIWebView开始加载
- (void)webViewDidStartLoad:(UIWebView *)webView;
//UIWebView加载完成
- (void)webViewDidFinishLoad:(UIWebView *)webView;
//UIWebView加载失败
- (void)webView:(UIWebView *)webView didFailLoadWithError:(NSError *)error;
@end
PS:这个地方重点。当时我们时模仿原生的 跳页之后加载新的html代码 不是在当页加载 所以shouldStartLoadWithRequest这个方法会在你点击的时候加载一次 你跳进新的界面有加载了一次。但是两次加载的内容是不一样的,这个地方注意一下。我的解决办法是这样的设置一个BOOL变量,当第一次点击去是加载,第二次加载(跳出的加载)就不走了。
实现方法:
#pragma mark --- 添加UIWebView的代理方法
- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType
{
if (!isTimes) {
isTimes = YES;
return YES;
}else{
NSURL *url = [request URL];(ps:获取到的url 一般是本地的链接)
FDLog(@"点击的链接%@",url);
[self pushToDetailViewController:url];
return NO;
}
}
/**
UIWebView 的代理方法(已经开始加载)
@param webView webView 创建的WebView
*/
- (void)webViewDidStartLoad:(UIWebView *)webView{
FDLog(@"点击的链接 执行的顺序");
}
/**
UIWebView 的代理方法(已经加载完成)
@param webView webView 创建的WebView
*/
- (void)webViewDidFinishLoad:(UIWebView *)webView{
[[JLJTools shareInstance] dismissSVProgressHUD];
FDLog(@"点击的链接 执行的顺序");
}。
/**
跳转到详情界面
@param detailUrl detailUrl 跳转到
*/
- (void)pushToDetailViewController:(NSURL*)detailUrl;
{
JLJGMdetailController * GMdetailVC = [[JLJGMdetailController alloc]init];
GMdetailVC.detailUrl = detailUrl;
[self.navigationController pushViewController:GMdetailVC animated:YES];
}
3、截取url和标签
由于要用到分享 所以要获取 这个html页面的title、url和Image 所以:
注意要在加载完成操作:
/**
UIWebView 的代理方法(已经加载完成)
@param webView webView 创建的WebView
*/
- (void)webViewDidFinishLoad:(UIWebView *)webView{
[[JLJTools shareInstance] dismissSVProgressHUD];
//分享时需要的题目
NSString *title = [GMDetailView stringByEvaluatingJavaScriptFromString:@"document.title"];
//界面上的题目
NSString * titleString = [GMDetailView stringByEvaluatingJavaScriptFromString:@"document.getElementById(\"app-title\").innerText"];
//图片地址
NSString * ImgString = [GMDetailView stringByEvaluatingJavaScriptFromString:@"document.getElementById(\"app-title\").getAttribute(\"data-shareimg\")"];
NSLog(@"网页端的名字~~%@~~%@,~~%@",ImgString,titleString,title);
//设置导航栏的名字
self.title = titleString;
//分享需要的题目 图片
detailTitle = title;
shareImg = ImgString;
}
这样就获取到了。可以分享了。
其实还有很多的获取html标签的方法:
参考的代码:http://blog.sina.com.cn/s/blog_b8e97683010183lz.html
感谢诸君,其实也是为了自己总结一下,小码农要不断的总结经验和教训。