疯狂ios讲义之网页控件(UIWebView)

博文视点 发布于 2014/01/26 09:52
阅读 2K+
收藏 3
iOS

通过使用UIWebView控件,可以实现一个内置的浏览器(类似于Safari),而且可以直接将这个浏览器内嵌到应用的任意位置,因此非常方便。

UIWebView直接继承了UIView基类,一般不可以与用户交互。

我们既可通过Interface BuilderUIWebView拖入界面设计文件中来添加该控件,也可通过代码创建UIWebView对象来添加,这两种方式的本质是相同的。

Interface Builder的界面设置文件中选中某个UIWebView,然后打开Xcode的属性检查器面板,可看到如图10.56所示的面板。

10.56  UIWebView对应的属性检查器面板

获取UIWebView对象后,可以配置的属性不同,常用属性有如下两个。

1scalesPageToFit:对应属性检查器面板中的Scales Page To Fit。该属性控制是否缩放网页以适应该控件。

2dataDetectorTypes:对应属性面板中的Detection属性,该属性支持如下枚举值。

Ø UIDataDetectorTypePhoneNumbe:自动检测网页上的电话号码,点击该号码就会拨号。

Ø UIDataDetectorTypeLink:自动检测网页上的超链接,点击该链接就会导航到链接对应的页面。

Ø UIDataDetectorTypeAddress:自动检测网页上的地址。

Ø UIDataDetectorTypeCalendarEvent :自动检测网页上的日历事件。

Ø UIDataDetectorTypeNone:不检测网页上的任何内容。

Ø UIDataDetectorTypeAll:自动检测网页上的所有特殊内容。

设置完UIWebView对象之后,接下来可通过如下方法控制UIWebView加载内容。

Ø - loadHTMLString:baseURL::加载并显示HTML字符串。

Ø - loadRequest::加载并显示指定URL对应网页。

Ø - stringByEvaluatingJavaScriptFromString::执行指定的JavaScript字符串,并返回执行结果。

除此之外,还可调用如下方法对UIWebView指定导航控制。

Ø - goBack:后退。

Ø - goForward:前进。

Ø - reload:重新加载网页。

Ø - stopLoading:停止加载网页。

UIWebView加载网页时,程序可为UIWebView设置一个delegate委托(该委托对象必须实现UIWebViewDelegate协议),该协议中包含如下方法。

Ø - webView:shouldStartLoadWithRequest:navigationType::该UIWebView将要开始装载指定URL对应的网页时激发该方法。

Ø - webViewDidStartLoad::该UIWebView开始装载时激发该方法。

Ø - webViewDidFinishLoad::该UIWebView装载完成时激发该方法。

Ø - webView:didFailLoadWithError::该UIWebView装载响应出现错误时激发该方法。

下面通过示例来介绍如何使用UIWebView显示HTML字符串。首先创建一个Single View Application,使用Interface Builder打开应用的界面设计文件,并将UIWebView拖入应用界面中,然后让该UIWebView占满整个手机屏幕。

为了在程序中访问该UIWebView控件,需要将它绑定到控制器类的webView IBAction属性。

下面开始修改控制器类的实现部分,主要就是使用UIWebView来装载、显示指定的HTML字符串,代码如下。

程序清单:codes/10/10.14/UIWebViewTest/UIWebViewTest /FKViewController.m

@implementation FKViewController
- (void)viewDidLoad
{
	[super viewDidLoad];
	NSMutableString* sb = [[NSMutableString alloc] init];
	// 拼接一段HTML代码
	[sb appendString:@"<html>"];
	[sb appendString:@"<head>"];
	[sb appendString:@"<title> 欢迎您 </title>"];
	[sb appendString:@"</head>"];
	[sb appendString:@"<body>"];
	[sb appendString:@"<h2> 欢迎您访问<a href=\"http://www.crazyit.org\">"];
	[sb appendString:@"疯狂Java联盟</a></h2>"];
	// HTML代码中支持JavaScript脚本
	[sb appendString:@"<script language='javascript'>"];
	[sb appendString:@"alert('欢迎使用UIWebView');</script>"];
	[sb appendString:@"</body>"];
	[sb appendString:@"</html>"];
	// 加载并显示HTML代码
	[self.webView loadHTMLString:sb
		baseURL:[NSURL URLWithString:@"http://www.fkit.org"]];
}
@end



上面的程序先拼接了一段HTML字符串,接下来的粗体字代码调用UIWebView的方法来装载并显示该HTML字符串,该HTML字符串中嵌入了JavaScript脚本——UIWebView完全支持它们。

编译、运行该程序,可以看到如图10.57所示的警告框。


10.57  使用UIWebView显示HTML字符串 

从图10.57可以看出,该UIWebView完全支持包含JavaScriptHTML字符串,图10.57中看到的警告框就是JavaScript执行的效果。

单击图10.57所示警告框的“OK”按钮,该应用将会显示如图10.58所示的效果。


 10.58  使用UIWebView显示HTML字符串

实例:迷你浏览器

借助UIWebViewloadRequest:方法,可让该控件加载并显示指定URL对应的网页。通过这个功能,可实现自己的浏览器。

首先创建一个Single View Application,使用Interface Builder打开应用的界面设计文件,并将UITextField(用于输入访问地址)、UIButtonUIWebView拖入应用界面中,然后将这些控件摆放整齐。

为了在程序中访问UITextFieldUIWebView控件,分别将它们绑定到addrwebView两个IBOutlet属性。为了让程序可以响应按钮的点击事件,还需为该按钮控件的Touch Up Inside事件绑定事件处理方法。

本例使用控制器对象作为UIWebView控件的委托对象,因此该控制器类需要实现UIWebViewDelegate协议。

接下来开始修改控制器类的实现部分,主要就是使用UIWebView来装载并显示指定的URL对应的网页,然后使用委托来监控装载过程事件,其代码如下。

程序清单:codes/10/10.14/MyBrowser/MyBrowser/FKViewController.m

@implementation FKViewController
UIActivityIndicatorView* activityIndicator;
- (void)viewDidLoad
{
	[super viewDidLoad];
	// 设置自动缩放网页以适应该控件
	self.webView.scalesPageToFit = YES;
	// 为UIWebView控件设置委托
	self.webView.delegate = self;
	// 创建一个UIActivityIndicatorView控件
	activityIndicator = [[UIActivityIndicatorView alloc]
		initWithFrame : CGRectMake(0.0f, 0.0f, 32.0f, 32.0f)];
	// 控制UIActivityIndicatorView显示在当前View的中央
	[activityIndicator setCenter: self.view.center];
	activityIndicator.activityIndicatorViewStyle
		= UIActivityIndicatorViewStyleWhiteLarge;
	[self.view addSubview : activityIndicator];
	// 隐藏activityIndicator控件
	activityIndicator.hidden = YES;
	[self goClicked:nil];
}
// 当UIWebView开始加载时激发该方法
- (void)webViewDidStartLoad:(UIWebView *)webView
{
	// 显示activityIndicator控件
	activityIndicator.hidden = NO;
	// 启动activityIndicator控件的转动
	[activityIndicator startAnimating] ;
}
// 当UIWebView加载完成时激发该方法
- (void)webViewDidFinishLoad:(UIWebView *)webView
{
	// 停止activityIndicator控件的转动
	[activityIndicator stopAnimating];
	// 隐藏activityIndicator控件
	activityIndicator.hidden = YES;
}
// 当UIWebView加载失败时激发该方法
- (void)webView:(UIWebView *)webView didFailLoadWithError:(NSError *)error
{
	// 使用UIAlertView显示错误信息
	UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@""
		message:[error localizedDescription]
		delegate:nil
		cancelButtonTitle:nil
		otherButtonTitles:@"确定", nil];
	[alert show];
}
- (IBAction)goClicked:(id)sender {
	[self.addr resignFirstResponder];
	// 获取用户输入的字符串
	NSString* reqAddr = self.addr.text;
	// 如果reqAddr不以http://开头,为该用户输入的网址添加http://前缀
	if (![reqAddr hasPrefix:@"http://"]) {
		reqAddr = [NSString stringWithFormat:@"http://%@" , reqAddr];
		self.addr.text = reqAddr;
	}
	NSURLRequest* request = [NSURLRequest requestWithURL:
		[NSURL URLWithString:reqAddr]];
	// 加载指定URL对应的网址
	[self.webView loadRequest:request];
}
@end



上面程序中的关键代码是最后一行粗体代码,这行代码调用了UIWebView的方法来加载并显示指定URL对应的网页。为了让程序界面更加友好,程序还为该UIWebView控件指定了self作为委托,该控制器会监听并处理UIWebView的装载过程:

Ø UIWebView开始加载URL对应的网页时,程序在中央显示一个转动的进度环。

Ø UIWebView加载完成时,程序隐藏中央转动的进度环。

Ø UIWebView加载失败时,程序使用UIAlertView显示错误信息。

编译、运行该程序,即可看到如图10.59所示的效果。




————本文节选自《疯狂ios讲义(上)》

加载中
OSCHINA
登录后可查看更多优质内容
返回顶部
顶部